编辑以前保存的文档也会在db

时间:2016-04-05 16:13:50

标签: javascript node.js mongodb express mongoose

仅供参考,在node.js上使用Mongodb,Express和Mongoose。

我使用.save()保存文档(包含数据的用户),然后我想通过.send()通过请求返回此用户。 但是我当然不想返回密码,因此我访问以前保存的文档并删除密码:

user.status = /* Create new status and assign */;
user.save();
user.password = undefined;

应该注意的是,这是在几个回调中(伪代码):

Users.findOne (
    // Do stuff
    user.token = /* New token */;
    user.save();

    Shops.findOne( /* search by userId */
        // Do stuff
        user._shopId = shopId;
        user.status = "active";
        user.save();

        // Hide password
        user.password = undefined;

        // Send
        res.send({success: true, user: user});
    )
)

我希望此用户的数据库文档保持不变,因为我在编辑后没有保存它。是的,如果我不是.save(),我可以随意更改它(例如使用更新来更新它及其回调.send())。

但是,文档的密码会被删除。 .save()是否异步,或者只是在线程的生命结束时运行,即使我把它放在代码的中间?

感谢。

1 个答案:

答案 0 :(得分:1)

user.save();给予回电。像这样:

Users.findOne (
// Do stuff
user.token = /* New token */;
user.save();

Shops.findOne( /* search by userId */
    // Do stuff
    user._shopId = shopId;
    user.status = "active";
    user.save(function(err, user){
        if(err) console.log(err);
        if(user){
            // Hide password
            user.password = undefined;
            res.send({success: true, user: user});
        }
});
));

回调中的所有内容都是同步的。因此,只有在保存用户时才会发送响应。

应注意.save()使用对象的指针进行保存,并且不会通过参数静态发送对象,因此在.save()完成之前更改此对象意味着它会在保存在数据库中之前被更改。