Node.js 使用mongoose查询两个用户之间的消息历史记录的建议
如何获取非当前登录用户的_id并将其用于查询条件 我目前正在尝试从用户数据库获取消息。 对于_id,我尝试使用ajaxget请求并将id作为req主体的数据传入。从一些研究中,我发现将数据传递给get请求是一个坏主意。 为什么?如果HTTP方法不能有实体体,例如GET,那么数据会附加到URL(“我尝试在Yikes之后从URL获取id”)。在URL中包含用户数据可能会产生各种后果。 模式:Node.js 使用mongoose查询两个用户之间的消息历史记录的建议,node.js,mongodb,mongoose,messaging,Node.js,Mongodb,Mongoose,Messaging,如何获取非当前登录用户的_id并将其用于查询条件 我目前正在尝试从用户数据库获取消息。 对于_id,我尝试使用ajaxget请求并将id作为req主体的数据传入。从一些研究中,我发现将数据传递给get请求是一个坏主意。 为什么?如果HTTP方法不能有实体体,例如GET,那么数据会附加到URL(“我尝试在Yikes之后从URL获取id”)。在URL中包含用户数据可能会产生各种后果。 模式: const userSchema = new Schema({ messages:[{ typ
const userSchema = new Schema({
messages:[{
type: Schema.Types.ObjectId,
ref: "Message"
}]
});
const messageSchema = new Schema({
content: {
type: String,
require: True,
},
sender: {
type: Schema.Types.ObjectId,
ref: "User"
},
receiver:{
type: Schema.Types.ObjectId,
ref: "User"
},
creation_date:{
type: Date,
default: Date.now
}
});
chatHistory.js:
$.ajax({
type: 'GET',
url: "/chatHistory"
}).then(function(data) {
if (data.length <= 0) {
//if no data
console.log('no DATA');
}
data.forEach(function(element) {
//do something with data
});
});
我能够通过post请求成功地将id存储到route.js文件中的一个变量中。现在,我正在处理查询参数,以便只显示在get请求中发送给特定用户的消息
工作代码
router.route('/messages')
.get(function(req, res) {
var current_date = new Date();
User.findOne({
username: req.user.username
}).populate(
'follow'
).populate(
'following'
).exec(function(err, user) {
if (!err) {
res.render("messages", {
user: user,
currentUserName: req.user.name,
creationDate: getCreationTimeString(current_date, req.user.creation_date)
});
} else {
console.log(err);
}
});
})
.post(function(req, res) {
var currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
var r_id = mongoose.Types.ObjectId(req.body.receiver_id);
console.log(req.body.receiver_id, " before", r_id, " after");
const message = new Message({
content: req.body.content,
sender: req.user._id,
receiver: req.body.r_id, //<- THE ERROR
creation_date: new Date()
});
message.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("Saving Message");
}
});
User.updateOne({
"_id": req.user._id
}, {
$push: {
"messages": message,
}
}, function(err) {
if (err) {
console.log(err);
}
});
});
router.route('/messages')
.get(function(req, res) {
var current_date = new Date();
User.findOne({
username: req.user.username
}).populate(
'follow'
).populate(
'following'
).exec(function(err, user) {
if (!err) {
res.render("messages", {
user: user,
currentUserName: req.user.name,
creationDate: getCreationTimeString(current_date, req.user.creation_date)
});
} else {
console.log(err);
}
});
})
.post(function(req, res) {
var currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
const message = new Message({
content: req.body.content,
sender: req.user._id,
receiver: req.body.receiver_id,
creation_date: new Date()
});
message.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("Saving Message");
}
});
User.updateOne({
"_id": req.user._id
}, {
$push: {
"messages": message,
}
}, function(err) {
if (err) {
console.log(err);
}
});
});
let receiver_id;
let mA;
let mB;
router.route('/chatHistory')
.get(function(req, res) {
async.parallel({
messagesAFind: function(callback) {
User.findOne({
_id: req.user._id
}).populate({
path: 'messages',
match: {
'receiver': receiver_id
}
}).exec(function(err, userA) {
if (err) return callback(err);
mA = userA.messages;
callback();
});
},
messagesBFind: function(callback) {
User.findOne({
_id: receiver_id
}).populate({
path: 'messages',
match: {
'receiver': req.user._id
}
}).exec(function(err, userB) {
if (err) return callback(err);
mB = userB.messages;
callback();
});
}
}, function(err) {
if (err) return next(err);
console.log(mA);
console.log(mB);
var allMessages = [];
allMessages.push(mA,mB);
res.json(allMessages);
});
})
.post(function(req, res) {
if (req.body.str === "getChatHistory") {
receiver_id = req.body.id;
}
});
chatHistory.js
$.ajax({
type: 'POST',
url: "/chatHistory",
data: dataToBeSent,
dataType: "json"
}).done(function(msg) {
console.log("Data Saved: " + msg);
}).fail(function(msg) {
console.log("Fail! " + msg.data);
});
$.ajax({
type: 'GET',
url: "/chatHistory",
}).then(function(data) {
if (data.length <= 0) {
console.log("no data");
} else {
data = data.reverse();
data.forEach(function(element) {
console.log(element);
});
}
});
主要问题是我是如何创建消息的。我存储的是一个不同于接收者的id
旧代码
router.route('/messages')
.get(function(req, res) {
var current_date = new Date();
User.findOne({
username: req.user.username
}).populate(
'follow'
).populate(
'following'
).exec(function(err, user) {
if (!err) {
res.render("messages", {
user: user,
currentUserName: req.user.name,
creationDate: getCreationTimeString(current_date, req.user.creation_date)
});
} else {
console.log(err);
}
});
})
.post(function(req, res) {
var currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
var r_id = mongoose.Types.ObjectId(req.body.receiver_id);
console.log(req.body.receiver_id, " before", r_id, " after");
const message = new Message({
content: req.body.content,
sender: req.user._id,
receiver: req.body.r_id, //<- THE ERROR
creation_date: new Date()
});
message.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("Saving Message");
}
});
User.updateOne({
"_id": req.user._id
}, {
$push: {
"messages": message,
}
}, function(err) {
if (err) {
console.log(err);
}
});
});
router.route('/messages')
.get(function(req, res) {
var current_date = new Date();
User.findOne({
username: req.user.username
}).populate(
'follow'
).populate(
'following'
).exec(function(err, user) {
if (!err) {
res.render("messages", {
user: user,
currentUserName: req.user.name,
creationDate: getCreationTimeString(current_date, req.user.creation_date)
});
} else {
console.log(err);
}
});
})
.post(function(req, res) {
var currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
const message = new Message({
content: req.body.content,
sender: req.user._id,
receiver: req.body.receiver_id,
creation_date: new Date()
});
message.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("Saving Message");
}
});
User.updateOne({
"_id": req.user._id
}, {
$push: {
"messages": message,
}
}, function(err) {
if (err) {
console.log(err);
}
});
});
let receiver_id;
let mA;
let mB;
router.route('/chatHistory')
.get(function(req, res) {
async.parallel({
messagesAFind: function(callback) {
User.findOne({
_id: req.user._id
}).populate({
path: 'messages',
match: {
'receiver': receiver_id
}
}).exec(function(err, userA) {
if (err) return callback(err);
mA = userA.messages;
callback();
});
},
messagesBFind: function(callback) {
User.findOne({
_id: receiver_id
}).populate({
path: 'messages',
match: {
'receiver': req.user._id
}
}).exec(function(err, userB) {
if (err) return callback(err);
mB = userB.messages;
callback();
});
}
}, function(err) {
if (err) return next(err);
console.log(mA);
console.log(mB);
var allMessages = [];
allMessages.push(mA,mB);
res.json(allMessages);
});
})
.post(function(req, res) {
if (req.body.str === "getChatHistory") {
receiver_id = req.body.id;
}
});
并行获取两个用户之间的所有消息
工作代码
router.route('/messages')
.get(function(req, res) {
var current_date = new Date();
User.findOne({
username: req.user.username
}).populate(
'follow'
).populate(
'following'
).exec(function(err, user) {
if (!err) {
res.render("messages", {
user: user,
currentUserName: req.user.name,
creationDate: getCreationTimeString(current_date, req.user.creation_date)
});
} else {
console.log(err);
}
});
})
.post(function(req, res) {
var currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
var r_id = mongoose.Types.ObjectId(req.body.receiver_id);
console.log(req.body.receiver_id, " before", r_id, " after");
const message = new Message({
content: req.body.content,
sender: req.user._id,
receiver: req.body.r_id, //<- THE ERROR
creation_date: new Date()
});
message.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("Saving Message");
}
});
User.updateOne({
"_id": req.user._id
}, {
$push: {
"messages": message,
}
}, function(err) {
if (err) {
console.log(err);
}
});
});
router.route('/messages')
.get(function(req, res) {
var current_date = new Date();
User.findOne({
username: req.user.username
}).populate(
'follow'
).populate(
'following'
).exec(function(err, user) {
if (!err) {
res.render("messages", {
user: user,
currentUserName: req.user.name,
creationDate: getCreationTimeString(current_date, req.user.creation_date)
});
} else {
console.log(err);
}
});
})
.post(function(req, res) {
var currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
const message = new Message({
content: req.body.content,
sender: req.user._id,
receiver: req.body.receiver_id,
creation_date: new Date()
});
message.save(function(err) {
if (err) {
console.log(err);
} else {
console.log("Saving Message");
}
});
User.updateOne({
"_id": req.user._id
}, {
$push: {
"messages": message,
}
}, function(err) {
if (err) {
console.log(err);
}
});
});
let receiver_id;
let mA;
let mB;
router.route('/chatHistory')
.get(function(req, res) {
async.parallel({
messagesAFind: function(callback) {
User.findOne({
_id: req.user._id
}).populate({
path: 'messages',
match: {
'receiver': receiver_id
}
}).exec(function(err, userA) {
if (err) return callback(err);
mA = userA.messages;
callback();
});
},
messagesBFind: function(callback) {
User.findOne({
_id: receiver_id
}).populate({
path: 'messages',
match: {
'receiver': req.user._id
}
}).exec(function(err, userB) {
if (err) return callback(err);
mB = userB.messages;
callback();
});
}
}, function(err) {
if (err) return next(err);
console.log(mA);
console.log(mB);
var allMessages = [];
allMessages.push(mA,mB);
res.json(allMessages);
});
})
.post(function(req, res) {
if (req.body.str === "getChatHistory") {
receiver_id = req.body.id;
}
});