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

为何使用bcrypt.compare时await关键字无作用?

关于bcrypt.compare的await提示及无await仍运行的问题

核心原因:bcrypt.compare的双调用模式

bcrypt的compare方法本身支持两种使用方式:

  • 传回调函数:走异步回调逻辑,不会返回Promise
  • 不传回调:自动返回Promise,这时候需要用await获取最终结果

VSCode标红的问题

大概率是类型定义文件(@types/bcrypt)的问题:要么是你安装的类型定义版本和bcrypt本体不匹配,要么是旧版类型定义存在错误,误把compare的返回值标记为布尔值而非Promise。VSCode依赖类型定义做语法检查,自然会提示await对布尔值无效,但实际运行时bcrypt还是会返回Promise,所以代码逻辑本身没问题。

为啥删了await还能正常运行

因为你的方法是async函数——async函数的特性是,如果你直接返回一个Promise,它会把这个Promise作为自己的最终返回值。换句话说:

// 移除await后的写法
async function comparePasswords(canditatePassword) {
  return bcrypt.compare(canditatePassword, this.password)
}
// 和以下写法的对外表现完全一致
async function comparePasswords(canditatePassword) {
  const isMatching = await bcrypt.compare(canditatePassword, this.password)
  return isMatching
}

只要调用这个方法时使用了await,就能正确拿到布尔结果,所以代码看起来能正常运行。不过前者是直接返回Promise,后者是等待Promise解析后返回布尔值,虽然对外效果相同,但后者的逻辑更清晰,可读性更强。

建议的处理方式

  1. 将bcrypt和@types/bcrypt更新到最新稳定版,修复类型定义的问题后,VSCode的标红提示就会消失。
  2. 保留await的写法,明确表达等待异步操作完成的逻辑,后续维护代码时不容易产生误解。

内容的提问来源于stack exchange,提问作者Programmer54

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:32:37