#node.js #mongodb #express #mongoose #backend
Вопрос:
Я внес некоторые изменения в список совпадений в начале, но в конце, когда я это делаю res.json(usr.matches)
, добавленные значения не отражаются в выходных данных.
Почему изменения не отражаются в выходных данных??
.post(isUser,(req,res,next) =>{
var userId = req.userId;
var matchId = req.body._id;
MatchList.findOne({user:userId})
.then((user) =>{
var idx = user.likes.indexOf(matchId);
user.likes.splice(idx,1);
idx = user.matches.indexOf(matchId);
if(idx<0) {user.matches.push(matchId);}
user.save();
MatchList.findOne({user:matchId})
.then((matchedUser) =>{
var matchidx = matchedUser.likes.indexOf(userId);
matchedUser.likes.splice(matchidx,1);
if(matchedUser.matches.indexOf(userId)<0)
matchedUser.matches.push(userId);
matchedUser.save();
},(err)=> next(err));
MatchList.findOne({user:userId})
.populate('matches')
.then((usr) =>{
res.statusCode = 200;
res.setHeader('Content-Type','application/json')
res.json(usr.matches);
},err => next(err));
},(err)=> next(err))
.catch((err)=> next(err))
})
Ответ №1:
Когда вы используете db.find({})
, первое, что требуется, — это filter
. Как вы можете видеть, вы используете user:userID
, где пользователь является объектом, в то время как идентификатор пользователя не является объектом. Таким образом , ваш результат останется прежним.
Ответ №2:
user.save()
является асинхронным, поэтому он может выполняться только позже findOne
.
Если вам нужно убедиться, что сохранение завершится до выполнения findOne, либо используйте wait, либо поместите последующую находку в обратный вызов, переданный для сохранения.