我有一个名为UserSchema的 Mongoose 模式,该模式存储有关所有用户的信息。
我想使用户能够更改他的信息,这可以通过使用.findByIdAndUpdate来尝试。
这是相关代码:

router.post("/updateprofile", function(req,res,next) {
    const {id, org, tel, email, firstName, lastName} = req.body;
    Users.findByIdAndUpdate(id, {org : org, tel : tel, email : email, firstName : firstName , lastName : lastName}, function (err, response) {
        if (err) throw err
        res.json(response);
    });

});

但是,当尝试更改信息时,出现以下错误消息:Cannot read property 'password' of undefined。我很确定这是由更新前的钩子(Hook)引起的,但是我无法删除它,因为我的“忘记密码”功能需要它。
这是代码:
UserSchema.pre('findOneAndUpdate', function (next) {
    this.update({},{ $set: { password:
    bcrypt.hashSync(this.getUpdate().$set.password, 10)}} )
    next();
});

我对它为何仍使用该预钩感到困惑,因为在钩子(Hook)中它正在寻找findOneandUpdate,并且当我尝试更改数据时我正在使用findByIdAndUpdate

我尝试使用.update()代替,但这也不起作用。有人知道我在做什么错以及如何解决吗?

最佳答案

看起来getUpdate不是您想要的,请尝试如下操作:

    UserSchema.pre('findOneAndUpdate', function (next) {
    this._update.password = bcrypt.hashSync(this._update.password, 10)
    next();
});

关于第二个问题,findByIdAndUpdate是findOneAndUpdate的包装。这是直接来自的代码,Mongoose的源代码供您引用
Model.findByIdAndUpdate = function(id, update, options, callback) {
  if (callback) {
    callback = this.$wrapCallback(callback);
  }
  if (arguments.length === 1) {
    if (typeof id === 'function') {
      var msg = 'Model.findByIdAndUpdate(): First argument must not be a function.\n\n'
          + '  ' + this.modelName + '.findByIdAndUpdate(id, callback)\n'
          + '  ' + this.modelName + '.findByIdAndUpdate(id)\n'
          + '  ' + this.modelName + '.findByIdAndUpdate()\n';
      throw new TypeError(msg);
    }
    return this.findOneAndUpdate({_id: id}, undefined);
  }

代码中的注释为:
/**
 * Issues a mongodb findAndModify update command by a document's _id field.
 * `findByIdAndUpdate(id, ...)` is equivalent to `findOneAndUpdate({ _id: id }, ...)`.
 *

您可以在这里阅读自己的源代码:https://github.com/Automattic/mongoose/blob/9ec32419fb38b74b240280aaba162f9ee4416674/lib/model.js

关于node.js - Mongoose .findByIdAndUpdate和更新前钩子(Hook)的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49113910/

10-10 15:55