为NestJs GraphQL查询装饰器设置多个返回类型

为NestJs GraphQL查询装饰器设置多个返回类型,graphql,nestjs,typegraphql,Graphql,Nestjs,Typegraphql,我想使用NestJs创建一个GraphQLAPI。据我所知,我不再为无效请求抛出HTTP异常。因此,我认为我必须创建我自己的“错误代码”,我可以发送回客户端。所以给出这个基本的例子 @ObjectType() export class ErrorResponse { @Field() message: string; } 我有一个服务函数,可以通过ID返回用户,并且我扩展了返回类型,以便在请求无效时返回错误对象 public async getUserById(id: number

我想使用NestJs创建一个GraphQLAPI。据我所知,我不再为无效请求抛出HTTP异常。因此,我认为我必须创建我自己的“错误代码”,我可以发送回客户端。所以给出这个基本的例子

@ObjectType()
export class ErrorResponse {
  @Field()
  message: string;
}
我有一个服务函数,可以通过ID返回用户,并且我扩展了返回类型,以便在请求无效时返回错误对象

  public async getUserById(id: number): Promise<ErrorResponse | User> {
    const user: User = await this.usersRepository.findOne(id);

    if (!user) {
      const errorResponse: ErrorResponse = new ErrorResponse();
      errorResponse.message = `User with ID ${id} does not exist`;
      return errorResponse;
    }

    return user;
  }
不会这样做,会出现这个错误

算术运算的左侧必须是“any”类型, 'number'、'bigint'或枚举类型.ts(2362)


这就是我针对类似情况提出的解决方案。 GraphQL需要单返回ObjectType。 首先,我创建了一个公共对象

@ObjectType()
export class MutationResult {
  @Field({ nullable: true })
  success?: boolean;

  @Field({ nullable: true })
  error?: boolean;
}
然后在用户模块中,我创建了两种对象类型-
user
UserResponse
。在UserResponse上,我扩展了公共
MutationResult
对象

@ObjectType()
export class User {
  @Field(type => ID)
  id: string;

  @Field()
  name: string;
}

@ObjectType()
export class UserResponse extends MutationResult {
  @Field()
  result: User;
}
现在在查询中,您可以这样做

mutation {
  addUser(name: "Test") {
    success,
    error,
    result {
      name
    }
  }
}

如果
ErrorResponse
User
都是
@ObjectType
,则只需使用
createUnionType
将它们“合并”在一起:


嗯,如果只有一种可能,那么这似乎就是答案
@ObjectType()
export class User {
  @Field(type => ID)
  id: string;

  @Field()
  name: string;
}

@ObjectType()
export class UserResponse extends MutationResult {
  @Field()
  result: User;
}
mutation {
  addUser(name: "Test") {
    success,
    error,
    result {
      name
    }
  }
}