gpt4 book ai didi

mongoose - Mongoose 中的钩子(Hook) : What is 'this'

转载 作者:行者123 更新时间:2023-12-04 17:51:25 25 4
gpt4 key购买 nike

我是 Express 和 Mongoose 的新手。我正在读这个tutorial这是教程中的一个片段,其中一个 user 被保存在数据库中。

// 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();
});
});
});
  1. 这个到底是什么。 this 是指新的/修改过的文档还是 this 是指存储在数据库中的旧文档?我想 this 是新文档。那么是否有任何关键字可以访问旧文档?在最坏的情况下,我认为,由于这是预保存,我可以使用 findOne 访问旧的/保存的文档。有比这种方法更好的方法吗?
  2. 此处作者正在检查密码是否已更改。所以我假设 isModified,比较新文档和旧文档中的给定字段,并根据是否修改返回一个 bool 值。问题是,虽然保存作者保存了一个散列,但在检查修改时,我想他应该先创建散列然后检查散列是否相同。我是对的,还是我在这里遗漏了什么。

最佳答案

1 - pre Hook 在将文档保存到数据库之前被调用——因此称为“pre”。 this 引用保存前的文档。它将包括您对其字段所做的任何更改。

例如,如果你这样做了

user.password = 'newpassword';
user.save();

然后,钩子(Hook)将在插入/更新数据库中的文档之前被触发

UserSchema.pre('save', function (next) {
console.log(this.password); // newpassword
next(); // do the actual inserting/updating
});

2 - 编辑用户时,您可以将表单的密码输入设置为空白。空白密码输入通常意味着不需要进行任何更改。如果输入新值,则视为更改密码。

然后,您将按如下方式更改架构:

添加 setter对于您的密码字段

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

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

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

关于mongoose - Mongoose 中的钩子(Hook) : What is 'this' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44514555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com