为何async调用bcrypt.hash返回undefined但.then写法正常运行
问题根因
返回undefined的核心原因是混用了bcrypt的回调调用模式和Promise调用模式:
- 当你给
bcrypt.hash传入第三个回调函数参数时,方法会自动切换为回调模式,此时方法本身不会返回Promise,外层return拿到的返回值固定为undefined - 你写在回调函数里的
return await newUser.save()只是回调函数的内部返回值,不会被外层的register方法透传给调用方,自然拿不到预期结果 - 额外写法错误:
async关键字错误加在了回调函数参数上,外层register方法本身不是async函数,也没有正确接收Promise链的结果。
你写的.then版本能正常运行,是因为没有传第三个回调参数,bcrypt.hash默认走Promise模式,返回的Promise链结果可以被正常透传。
正确的async/await写法
不要给bcrypt.hash传回调参数,把register方法标记为async,直接用await接收哈希结果即可:
userService.register = async (username, password) => { const hash = await bcrypt.hash(password, saltRounds) const newUser = new user({ username: username, password: hash }) return newUser.save() }
注意事项
- bcrypt的异步方法都是二选一的调用逻辑:传回调就走回调模式无返回值,不传回调就返回Promise,不要两种模式混写
await关键字必须在被async标记的函数内部使用,不要把async关键字加在回调参数上- 回调模式下如果要把结果返回给外层,需要自己手动封装Promise,不推荐这么写,直接用原生Promise模式更简洁。
内容的提问来源于stack exchange,提问作者Azizamari
相关产品推荐
相关产品推荐

