Я использую express.js, node.js для подключения mongoDB.
Моя цель
У меня есть коллекция викторин . У меня ** коллекция ответов ****.
Когда я показываю пользователю список тестов, я хочу показать пользователю, участвовал ли он в каких-либо из них.
Мой путь
- Я добавил логическое поле для каждого документа в коллекции викторин как "user_participated": false .
- Когда мой маршрут вызывает «/ 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){
}
};