猫鼬findByIdAndUpdate似乎绕过了我之前的“保存”钩子,并返回了过时的数据

时间:2019-06-19 21:55:59

标签: node.js mongodb express mongoose put

我的用户模型上有一个预先“保存”的钩子,用于使用bcrypt进行密码加密,在创建新的用户记录时效果很好。但是,在编辑用户(为简便起见,我使用findByIdAndUpdate)并更改密码时,似乎绕过了该钩子并另存为纯文本。从Mongoose文档中,我被认为是任何更新事件都称为“保存”中间件,那么为什么会发生这种情况以及如何解决呢?

此外,尽管使用了异步/等待,响应仍返回n-1个数据。

exports.editUser = async function(req, res, next) {
  try {
    const user = await db.User.findByIdAndUpdate(req.params.id, req.body, {useFindAndModify: false}); 
    return res.status('200').json(user); 
  }
  catch(err) {
    console.log(err);
    return next({
      status: 400, 
      message: 'User could not be updated or does not exist.'
    });
  }
};

假设我们的电子邮件以“ email@email.com”开始,并且我使用req.body.email =“ newemail@email.com”向该用户发送了一个PUT请求到我的“编辑”路由。返回的JSON仍然显示“ email:email@email.com”。现在,假设我通过req.body.email =“ thirdemail@email.com”发送了另一个PUT请求。现在,返回的JSON会显示“ email:newemail@email.com”。

因此,更新似乎正确进行,但是返回的用户对象未反映该更新。鉴于使用了“等待”,我的“用户”变量代表的用户对象不应该是更新的用户记录吗?

1 个答案:

答案 0 :(得分:0)

好的,看来它绕过验证器的原因已在此处详细说明:Why Mongoose doesn't validate on update?

对我来说,还不是很清楚为什么runValidators = true无法激活我的中间件,或者为什么返回的User对象不是更新的版本,但是无论如何我都会将此标记为已完成。