NestJS+GraphQL中使用Bcrypt为何必须用Promise形式?
为什么回调形式调用bcrypt.compare会触发GraphQL非空字段错误?
核心原因是异步代码的返回值处理不符合GraphQL非空字段的要求,具体拆解:
你的
getUser是async函数,且在GraphQL Schema中被定义为非空字段,这要求它必须返回符合结构的有效对象,绝对不能返回null或undefined。当使用bcrypt的回调形式时:
bcrypt.compare是异步执行的,回调函数会在后续事件循环中触发,但getUser函数会直接执行到末尾,没有返回任何有效内容。async函数如果没有显式返回值,会默认返回Promise.resolve(undefined),GraphQL拿到这个undefined后,会将其视为null,直接触发非空字段的报错:"Cannot return null for non-nullable field Query.getUser."
而使用Promise形式时:
- 你直接
return了bcrypt.compare返回的Promise对象,async函数会自动等待这个Promise完成,并将Promise最终resolve的结果(也就是你在then里返回的{result, message}结构对象)作为getUser函数的返回值。 - 这样GraphQL就能拿到符合要求的非空对象,完全满足字段约束,不会报错。
- 你直接
总结:回调形式下,函数没等异步验证完成就返回了空值;Promise形式则正确把异步操作的结果传递给了GraphQL,符合非空字段的要求。
内容的提问来源于stack exchange,提问作者Gagan
相关产品推荐
相关产品推荐

