为什么我的 mongoose 文档没有在 bcrypt 函数中正确更新?
Why isn't my mongoose document updated properly inside of the bcrypt functions?
我正在尝试在对文档调用保存之前对密码进行哈希处理。我尝试生成一个散列(效果很好),然后用新的散列密码更新文档的密码字段(字符串类型)。
然而,user.password = hash
行没有任何改变。
我检查了我的数据库,没有任何改变!更奇怪的是,如果我尝试在 外部 hash/bcrypt 函数中更改我的文档数据,它工作正常。
例如,如果我用密码 "fake1" 初始化我的文档,然后将 user.password = "fakepassword"
放在我的散列函数之外,它会很好地更新它。 ...
这是为什么?输入散列函数后,引用 this
会发生变化吗?我见过的每个例子(我已经搜索了几个小时)都和我的一模一样……为什么我的不起作用?
userSchema.pre('save', function(next) {
var user = this; // i reference the doc by "this"
bcrypt.genSalt(SALT_WORK_FACTOR, function(err,salt){
if(err){
console.log("error with salt \n");
}
bcrypt.hash(user.password,salt,function(error,hash){
if (error){
console.log("error with hash \n");
}
user.password = hash; // this line doesn't do anything!
});
});
return next(user);
});
您应该在异步 bcrypt 代码完成后调用 next()
。现在,您无需等待 bcrypt.genSalt/bcrypt.hash
.
的结果即可调用它
此外,传递给 next
的参数是为错误保留的。如果一切顺利,你应该调用 next
而不带任何参数。
这是中间件的清理版本:
userSchema.pre('save', function(next) {
var user = this;
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
if (err) {
console.log("error with salt \n");
// Pass error back to Mongoose.
return next(err);
}
bcrypt.hash(user.password, salt, function(error, hash) {
if (error) {
console.log("error with hash \n");
return next(error);
}
user.password = hash;
// Here are we done with the bcrypt stuff, so it's time to call `next`
next();
});
});
});
我正在尝试在对文档调用保存之前对密码进行哈希处理。我尝试生成一个散列(效果很好),然后用新的散列密码更新文档的密码字段(字符串类型)。
然而,user.password = hash
行没有任何改变。
我检查了我的数据库,没有任何改变!更奇怪的是,如果我尝试在 外部 hash/bcrypt 函数中更改我的文档数据,它工作正常。
例如,如果我用密码 "fake1" 初始化我的文档,然后将 user.password = "fakepassword"
放在我的散列函数之外,它会很好地更新它。 ...
这是为什么?输入散列函数后,引用 this
会发生变化吗?我见过的每个例子(我已经搜索了几个小时)都和我的一模一样……为什么我的不起作用?
userSchema.pre('save', function(next) {
var user = this; // i reference the doc by "this"
bcrypt.genSalt(SALT_WORK_FACTOR, function(err,salt){
if(err){
console.log("error with salt \n");
}
bcrypt.hash(user.password,salt,function(error,hash){
if (error){
console.log("error with hash \n");
}
user.password = hash; // this line doesn't do anything!
});
});
return next(user);
});
您应该在异步 bcrypt 代码完成后调用 next()
。现在,您无需等待 bcrypt.genSalt/bcrypt.hash
.
此外,传递给 next
的参数是为错误保留的。如果一切顺利,你应该调用 next
而不带任何参数。
这是中间件的清理版本:
userSchema.pre('save', function(next) {
var user = this;
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
if (err) {
console.log("error with salt \n");
// Pass error back to Mongoose.
return next(err);
}
bcrypt.hash(user.password, salt, function(error, hash) {
if (error) {
console.log("error with hash \n");
return next(error);
}
user.password = hash;
// Here are we done with the bcrypt stuff, so it's time to call `next`
next();
});
});
});