首页 > 解决方案 > Mongoose .save() 未执行

问题描述

我有这段代码不起作用。我正在尝试在使用ObjectId(通过将其添加到数组)修改后保存用户文档。但是,user.save()永远不会执行(我知道这一点是因为数据库中的文档没有改变),回调/承诺也没有。然而Voot,正在被保存。

我尝试过调整回调和承诺,但没有成功。有谁知道该怎么做?

这是代码:

(为避免混淆,请注意handleError()andsendJson()函数是我制作的自定义函数)

// Create new voot
var newVoot = Voot({
    title,
    body,
    user: userId,
    is_public,
    create_date
});
newVoot.save().then((voot) => {
    User.findById(userId, (err, user) => {
        handleError(err, 400, res);
        if (user) {
            user.voots.push(voot._id);
            // This console log shows me the correct modified user document
            console.log(user);
            user.save().then(() => {
                // This console.log and sendJson does not get executed
                console.log("User object is saved");
                sendJson(200, {voot}, res);
            }).catch((err) => {
                // This console log does not get executed
                console.log(err);
            });
        }
    })
});

标签: javascriptnode.jsmongodbmongoose

解决方案


User.findById(userId, (err, user) => ...在其回调函数中有两个参数:erruser.

user是从 MongoDB 返回的文档,这意味着它是一个普通的 Javascript 对象,因此您不能调用.save()它。

对于这个用例,您可以使用 Mongoose 的findbyIdAndUpdate(),它将执行您对User模型所需的两项操作。只需记住将{ upsert: true }其作为选项对象提供,以确保您创建一个新文档(如果它尚不存在)。

例子

User.findByIdAndUpdate({ id }, { update1: 'value' }, { upsert: true }, (err, result) => {
  // handle result
})

推荐阅读