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();