You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:01:05