Express node.js控制器不等待数据操作并返回旧数据

时间:2019-01-06 07:01:23

标签: node.js express mangodb

我正在使用express.js,node.js连接mongoDB。

我的目标

我有一个测验集合。我有一个**答案收藏****。 当我向用户显示测验列表时,我想向用户显示他/她是否已经参加了任何测验。

我的方式

  1. 我向测验集合中的每个文档添加了一个布尔字段,为“ user_participated”:false
  2. 当我的路线调用“ / all-quizzes”时,它会从控制器中调用一个函数,该函数首先在forEach中将所有文档“ user_participated”设置为false,然后根据当前的“ user_id”和“ quiz_id”查找一个数据来自同一forEach内部的“答案”集合,如果存在,则将测验文档的“ user_participated”设置为true 。然后返回全部数据。

我的问题

控制器功能中的

很快会找到所有测验文档,它不会等到'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){

    }
};

1 个答案:

答案 0 :(得分:1)

我认为您的返回值finalQuizsforEach语句之前已填充。因此,更新查询不会像您期望的那样对其进行更改。这是刷新页面后获取更新数据的原因。 如果您希望返回的值是user_participated: true,则应该在findOneAndUpdate行之后得到它。 您应该在try块的结尾处执行以下操作:

return await newQuiz.findAll();