Контроллер экспресс-узла.js не ожидает обработки данных и возвращает старые данные - PullRequest
0 голосов
/ 06 января 2019

Я использую express.js, node.js для подключения mongoDB.

Моя цель

У меня есть коллекция викторин . У меня ** коллекция ответов ****. Когда я показываю пользователю список тестов, я хочу показать пользователю, участвовал ли он в каких-либо из них.

Мой путь

  1. Я добавил логическое поле для каждого документа в коллекции викторин как "user_participated": false .
  2. Когда мой маршрут вызывает «/ all-quizzes», он вызывает функцию из контроллера, которая сначала устанавливает весь ложь «user_participated» документа в стороне forEach, затем в соответствии с текущими «user_id» и «quiz_id» находит одни данные из коллекции "answers" внутри того же 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 голосов
/ 06 января 2019

Я думаю, что ваше возвращаемое значение finalQuizs заполняется перед оператором forEach. Таким образом, запросы на обновление не изменяют его, как вы ожидаете Это является причиной получения обновленных данных после обновления страницы.
Если вы ожидаете получить user_participated: true в возвращаемом значении, вы должны получить его после строки findOneAndUpdate. Вы должны сделать что-то подобное в конце блока try:

return await newQuiz.findAll();
...