不能为不可为空的字段 Mutation.create 返回 null in typegraphql with bcryp



我正在尝试使用打字稿中的apollo-server,typeorm,bcrypt和下面的解析器打字。运行突变查询时,它会引发错误"无法为不可为空的字段 Mutation.create 返回空值"。但它正在使用散列密码将数据保存到数据库中(我也可以使用 console.log 确定推断这一点(;只有突变查询在浏览器中抛出错误。

这是突变解析器:

@Mutation(returns => Users)
create(@Arg("newuser") newuser: UserInput): Promise<Users> | any {
bcrypt.hash(newuser.loginpassword, 12)
.then( hash => {
const new_user = this.usersRepository.create(newuser);
new_user.loginpassword = hash;
return this.usersRepository.save(new_user);
});
}

当 bcrypt 相关的东西被注释掉时也是如此,如下所示,不返回任何错误(当然密码没有散列(

@Mutation(returns => Users)
create(@Arg("newuser") newuser: UserInput): Promise<Users> | any {
// bcrypt.hash(newuser.loginpassword, 12)
// .then( hash => {
const new_user = this.usersRepository.create(newuser);
//new_user.loginpassword = hash;
return this.usersRepository.save(new_user);
//});
}

在这两种情况下,突变都能够创建记录并保存它们;哈希也使用bcrypt代码成功生成。

在过去的 2 周里,我正在尝试解决这个问题,在这里搜索(Graphql、node.js 和 sql,无法为不可为空字段和许多类似字段返回 null(寻找解决此问题的线索。

  1. 第一个版本(即包含 bcrypt 代码(有什么问题,我尝试将返回类型更改为 Users | any from Promise | any,并再添加一个返回 Users 对象而不是 promise 对象的 .then 语句?

  2. 同样在 Graphql、node.js 和 sql 中,对于不可为空的字段不能返回 null,Benjie 先生暗示 https://www.graphile.org/postgraphile/why-nullable/#nulls-in-graphql。但我完全不知道如何编写可空的突变.create。有人可以提示或指出一个例子或这样的模式吗?

  3. 如果我将创建的返回声明保留为"承诺<用户>"而不是"承诺<用户>| any",打字稿不满意并期待返回语句。但是如果我在最后添加 return 语句,create 将立即返回。那么,退货声明是否为"承诺<用户>|任何'是正确的方法?

谢谢大家。

我不是肯定的,但我看到了一些可能导致这种情况的事情。

  1. 在您的第一个代码片段中,唯一的 return 语句位于传递给then的回调函数内。因此,create方法不返回任何内容。

  2. 我查看了类型ORM的src...当输入值是单个实体对象时,看起来Repository.save()返回Promise<Entity>(而不是Promise<Entity[]>((请参阅 Repository.ts(。如果是这种情况,您的 GraphQL 架构将期望此突变返回用户数组,但解析器返回单个用户。

尝试将返回类型更改为Promise<User>

@Mutation(returns => User)
create(@Arg("newuser") newuser: UserInput): Promise<User> {
return bcrypt.hash(newuser.loginpassword, 12)
.then( hash => {
const new_user = this.usersRepository.create(newuser);
new_user.loginpassword = hash;
return this.usersRepository.save(new_user);
});
}

最新更新