Mongoose 猫鼬的钩子:什么是';这';

Mongoose 猫鼬的钩子:什么是';这';,mongoose,Mongoose,我是新的表达和猫鼬。我在读这个 下面是教程中的一个片段,其中一个用户正在数据库中保存 // Execute before each user.save() call UserSchema.pre('save', function(callback) { var user = this; // Break out if the password hasn't changed if (!user.isModified('password')) return callback();

我是新的表达和猫鼬。我在读这个 下面是教程中的一个片段,其中一个
用户
正在数据库中保存

// Execute before each user.save() call
UserSchema.pre('save', function(callback) {
  var user = this;

  // Break out if the password hasn't changed
  if (!user.isModified('password')) return callback();

  // Password changed so we need to hash it
  bcrypt.genSalt(5, function(err, salt) {
    if (err) return callback(err);

    bcrypt.hash(user.password, salt, null, function(err, hash) {
      if (err) return callback(err);
      user.password = hash;
      callback();
    });
  });
});
  • 这到底是什么。
    是指新的/修改的文档还是
    是指存储在数据库中的旧文档?我想这是新文件。那么,是否有任何关键字可以访问旧文档?在最坏的情况下,我认为,由于这是预保存,我可以使用
    findOne
    访问旧的/保存的文档。还有比这更好的方法吗
  • 在这里,作者正在检查密码是否已更改。因此,我假设
    已修改
    ,比较新文档和旧文档中的给定字段,并根据修改与否返回布尔值。问题是,在保存时,作者保存了一个散列,但在检查修改时,我认为他应该首先创建散列,然后检查散列是否相同。我是对的,还是我遗漏了什么

  • 1-在将文档保存到数据库中之前调用
    pre
    hook,因此出现了“pre”一词<代码>此指保存前的文档。它将包括您对其字段所做的任何更改

    例如,如果你做了

    user.password = 'newpassword';
    user.save();
    
    然后,钩子将在数据库中插入/更新文档之前触发

    UserSchema.pre('save', function (next) {
        console.log(this.password); // newpassword
        next(); // do the actual inserting/updating
    });
    
    2-编辑用户时,可以将表单的密码输入设置为空。空白密码输入通常意味着不需要进行更改。如果输入了新值,则视为更改密码

    然后,您将按以下方式更改模式:

    为您的密码字段添加密码

    let UserSchema = new mongoose.Schema({
        password: {
            type: String,
            // set the new password if it provided, otherwise use old password
            set: function (password) {
                return password || this.password;
            }
        }
        // etc
    });
    
    UserSchema.pre('save', function (next) {
        var user = this;
        // hash password if it present and has changed
        if (user.password && user.isModified('password')) {
            // update password
        } else {
            return next();
        }
    });
    
    使用此方法,您可能必须使用以下两种方法之一:

    var user = new User({ password: req.body.password });
    user.save();
    

    不确定第一个示例是否适用于setter

    user.set({ password: req.body.password });
    user.save();