【发布时间】:2018-07-25 18:02:31
【问题描述】:
在预保存挂钩中调用异步函数将返回给我undefined 以获取密码。我在这里从根本上误解了async 吗?我已经在我的应用程序的其他领域成功地使用了它,它似乎工作正常......
userSchema.pre('save', function (next) {
let user = this
const saltRounds = 10;
const password = hashPassword(user)
user.password = password;
next();
})
async hashPassword(user) {
let newHash = await bcrypt.hash(password, saltRounds, function(err, hash) {
if (err) {
console.log(err)
}
return hash
});
return newHash
}
【问题讨论】:
-
你明白
const password = hashPassword(user)将是一个Promise - 因为这是async函数返回的(立即) - 因此,你将设置user.password = a_promise和在 promise 解决之前调用next- 下一个问题是,pre save hook 是否理解 promises -
在这种情况下,我需要使用
password.then(user.password = password)吗?这是有道理的,但我认为我需要更好地理解异步/承诺 -
确实,然后调用 next inside .then ... 你可以 avoid .then 通过
userSchema.pre('save', async function (next) {- 然后你可以const password = await hashPassword(user)- 在功能上,这(几乎0与 .then 模式相同 -
知道了。现在说得通了。
-
当然,您的代码中的其他错误包括:1 -
async hashPassword(user) {- 但用户从未在该函数中使用。 2 - 该函数从哪里获得saltRounds? 3 - .hash 的回调将返回哈希,无论是否有错误
标签: javascript node.js mongoose