настроить несколько типов возврата для декоратора Nest Js GraphQL Query - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу создать GraphQL API с помощью Nest Js. Насколько я понял, я больше не буду выдавать исключения HTTP для недействительных запросов. Поэтому я думаю, что должен создать свои собственные "коды ошибок", которые я могу отправить обратно клиенту. Поэтому, учитывая этот базовый c пример

@ObjectType()
export class ErrorResponse {
  @Field()
  message: string;
}

, у меня есть сервисная функция для возврата пользователя по его идентификатору, и я расширил тип возвращаемого значения для возврата объекта ошибки, если запрос был недействительным.

  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;
  }

Первоначально распознаватель был чем-то вроде

  @Query(() => User)
  public async user(@Args('id') id: number): Promise<ErrorResponse | User> {
    return this.usersService.getUserById(id);
  }

, но, как упоминалось выше, также можно вернуть ErrorResponse, если id не существует. Как я могу создать декоратор запросов для обеспечения нескольких типов возвращаемых данных?

@Query(() => ErrorResponse | User)

не справится с задачей и обнаружится с этой ошибкой

Левая часть arithmeti c операция должна иметь тип 'any', 'number', 'bigint' или enum type.ts (2362)

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Это решение, которое я придумал для аналогичной ситуации. GraphQL ожидает однократного возврата ObjectType. Сначала я создал общий объект

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

  @Field({ nullable: true })
  error?: boolean;
}

Затем в пользовательском модуле я создал 2 типа объектов - 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
    }
  }
}
0 голосов
/ 23 февраля 2020

Если ErrorResponse и User являются @ObjectType, вам просто нужно объединить их вместе, используя createUnionType:

https://typegraphql.ml/docs/unions.html

...