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

NestJS+GraphQL中使用Bcrypt为何必须用Promise形式?

为什么回调形式调用bcrypt.compare会触发GraphQL非空字段错误?

核心原因是异步代码的返回值处理不符合GraphQL非空字段的要求,具体拆解:

  1. 你的getUser是async函数,且在GraphQL Schema中被定义为非空字段,这要求它必须返回符合结构的有效对象,绝对不能返回null或undefined。

  2. 当使用bcrypt的回调形式时:

    • bcrypt.compare是异步执行的,回调函数会在后续事件循环中触发,但getUser函数会直接执行到末尾,没有返回任何有效内容。
    • async函数如果没有显式返回值,会默认返回Promise.resolve(undefined),GraphQL拿到这个undefined后,会将其视为null,直接触发非空字段的报错:"Cannot return null for non-nullable field Query.getUser."
  3. 而使用Promise形式时:

    • 你直接return了bcrypt.compare返回的Promise对象,async函数会自动等待这个Promise完成,并将Promise最终resolve的结果(也就是你在then里返回的{result, message}结构对象)作为getUser函数的返回值。
    • 这样GraphQL就能拿到符合要求的非空对象,完全满足字段约束,不会报错。

总结:回调形式下,函数没等异步验证完成就返回了空值;Promise形式则正确把异步操作的结果传递给了GraphQL,符合非空字段的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:15:07