Почему изменения не отражаются в выходных данных?

#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, либо поместите последующую находку в обратный вызов, переданный для сохранения.