为何使用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解析后返回布尔值,虽然对外效果相同,但后者的逻辑更清晰,可读性更强。
建议的处理方式
- 将
bcrypt和@types/bcrypt更新到最新稳定版,修复类型定义的问题后,VSCode的标红提示就会消失。 - 保留
await的写法,明确表达等待异步操作完成的逻辑,后续维护代码时不容易产生误解。
内容的提问来源于stack exchange,提问作者Programmer54
相关产品推荐
相关产品推荐

