问题描述
如何获取不是当前用户登录名的用户的_id并将其用于查询条件?
我目前正在尝试从用户数据库获取消息。 对于_id,我尝试使用ajax get请求并将id传递为req主体的数据。通过一些研究,我发现将数据传递给get请求是一个坏主意。 为什么?如果HTTP方法是不能具有实体主体(例如GET)的方法,则数据将附加到URL(“我试图在Yikes之后从URL中获取ID”)。 URL中包含用户数据可能会产生各种各样的后果。 https://security.stackexchange.com/questions/29598/should-sensitive-data-ever-be-passed-in-the-query-string。
模式:
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,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
});
});
路由:
router.route('/chatHistory')
.get(function(req,res) {
User.findOne({
_id: req.user._id
}).populate({
path: 'messages',match: { 'receiver': receiver_id },}).exec(function(err,user) {
if (!err) {
res.json(user.messages);
} else {
console.log(err);
}
});
});
通过发布请求,我能够将ID成功存储到我的route.js文件中的变量中。现在,我正在处理查询参数,以仅显示我在get请求中发送给特定用户的消息。
工作代码
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',}).then(function(data) {
if (data.length <= 0) {
console.log("no data");
} else {
data = data.reverse();
data.forEach(function(element) {
console.log(element);
});
}
});
我的messageSchema中有错字。在我的数据库中,接收者被拼成接收者。 FeelsBadMan。
工作代码
路由
var receiver_id;
//Query On Messages
router.route('/chatHistory')
.get(function(req,res) {
var id = mongoose.Types.ObjectId(receiver_id);
console.log(id);
Message.find({
receiver: { $eq: id}
}).exec(function(err,messages) {
if (!err) {
console.log(messages);
res.json(messages);
} else {
console.log(err);
}
});
})
.post(function(req,res) {
if (req.body.str === "getChatHistory") {
receiver_id = req.body.id;
}
});
//Query on users
router.route('/chatHistory')
.get(function(req,user) {
if (!err) {
res.json(user.messages);
} else {
console.log(err);
}
});
})
.post(function(req,res) {
if (req.body.str === "getChatHistory") {
receiver_id = req.body.id;
}
});
主要问题是我如何创建消息。除了接收方的ID,我还存储了另一个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 currentUserName = req.user ? req.user.name : "Annonomous";
if (currentUserName === "Annonomous") {
res.redirect("/account");
}
const message = new Message({
content: req.body.content,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
},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;
}
});
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)