Перегрузка схемы GraphQL для поддержки получения пользователя по имени пользователя или паролю - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь создать схему GraphQL таким образом, чтобы пользователь мог найти пользователя по его электронной почте или имени пользователя. Представьте себе, что для этих целей у одного пользователя может быть электронное письмо, которое является именем другого пользователя.

Мои typeDefs выглядят следующим образом:

const typeDefs = gql`
  type Query {
    user: User(username: String!)
    user: User(email: String!)
  }
`;

Это действительная схема? Если нет, то как мне изменить свое решение, чтобы оно было действительным и решило мою проблему?

Редактировать: Итак, я попытался выполнить вышеизложенное, и у меня появляется ошибка: «Ошибка: поле« Query.user »можно определить толькоодин раз.'Как я и думал.

Есть ли способ убедиться, что ровно один из username и email является нулевым в следующем: user: User(username: String, email: String)?

1 Ответ

0 голосов
/ 30 октября 2019

В GraphQL нет "перегрузки" полей и нет синтаксиса, который бы поддерживал одно из двух обязательных полей. Аргумент либо обнуляемый, либо ненулевой, вот и все. Вы можете сделать это:

type Query {
  user(username: String, email: String): User
}

или это

type Query {
  user(filter: UserFilter!): User
}

input UserFilter {
  username: String
  email: String
}

, а затем обработать проверку (хотя бы один аргумент определен, но не оба) внутри вашего преобразователя. Единственный другой способ сделать это - что-то вроде:

type Query {
  user(key: UserFilterKey!, value: String!): User
}

enum UserFilterKey {
  username
  email
}

Но такой подход не очень интуитивен для тех, кто использует схему. Это также работает, только если рассматриваемые аргументы имеют одинаковый тип.

...