Контроллер экспресс-узла.js не ожидает обработки данных и возвращает старые данные
Я использую express.js, node.js для подключения mongoDB.
Моя цель
У меня есть коллекция викторин. У меня ** коллекция ответов ****. Когда я показываю пользователю список тестов, я хочу показать пользователю, участвовал ли он в каких-либо тестах.
Мой метод
- Я добавил логическое поле для каждого документа в коллекции викторин как "user_participated": false.
- Когда мой маршрут вызывает "/all-quizzes", он вызывает функцию из контроллера, которая сначала устанавливает весь ложь "user_participated" документа в сторону forEach, затем в соответствии с текущими "user_id" и "quiz_id" находит данные из "ответов". msgstr "коллекция внутри того же самого 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 ответ
Я думаю, что ваше возвращаемое значение finalQuizs
заполняется до forEach
заявление. Таким образом, запросы на обновление не изменяют его, как вы ожидаете. Это причина получения обновленных данных после обновления страницы.
Если вы ожидаете иметь user_participated: true
в возвращаемом значении вы должны получить его после findOneAndUpdate
линия. Вы должны сделать что-то подобное в конце try
блок:
return await newQuiz.findAll();