我正在使用express.js,node.js连接mongoDB。
我有一个测验集合。我有一个**答案收藏****。 当我向用户显示测验列表时,我想向用户显示他/她是否已经参加了任何测验。
很快会找到所有测验文档,它不会等到'forEach'被执行并返回数据后才执行'forEach'。 因此,当我再次刷新页面时,我可以看到所做的操作。
exports.getAllQuiz = async function(req, res){
var newQuiz = new Quiz; // declaring that newQuiz is an instance of quiz helper
try{
var finalQuizs = await newQuiz.findAll();
var authToken = req.cookies.auth; // getting the logged in user token
var autherised_user = '';
if(authToken != undefined && authToken != null && authToken.trim().length > 0){
jwt.verify(authToken, config.secret, function(err, decoded) {
if (err) return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' });
else {
autherised_user = decoded.id;
finalQuizs.forEach(async function(item){
// first I am setting all the document's user_participated value to false
await quizModel.findOneAndUpdate({_id : ObjectId(item._id)}, {user_participated : false});
// now I am setting selected documents user_participated to true as per current user
// for that I am checking in answer collection if a data is present with
// current user id and this quiz id
await AnswerModel.findOne({quiz_id : item._id, participated_user_id : autherised_user}, async function(err, result){
if(result != null){
await quizModel.findOneAndUpdate({_id : ObjectId(item._id)}, {user_participated : true});
}
});
});
}
});
}
return finalQuizs;
}catch(e){
}
};
答案 0 :(得分:1)
我认为您的返回值finalQuizs
在forEach
语句之前已填充。因此,更新查询不会像您期望的那样对其进行更改。这是刷新页面后获取更新数据的原因。
如果您希望返回的值是user_participated: true
,则应该在findOneAndUpdate
行之后得到它。
您应该在try
块的结尾处执行以下操作:
return await newQuiz.findAll();