Мутация Apollo / GraphQL / Prisma "Login" не возвращает все пользовательские поля - PullRequest
0 голосов
/ 18 июня 2020

Я относительно новичок в мире GraphQL / Prisma / Apollo и работаю над приложением, в котором мне нужны функции входа в систему и ограничения доступа, основанные на разрешениях пользователя.

Когда я запускаю свою мутацию входа в систему, это терпит неудачу, если я запрашиваю возвращение поля «роли» пользователя, и я не могу, хоть убей, понять почему.

Если я сделаю простой запрос для всех пользователей и запрошу поле «роли», он возвращает без проблем. Точно так же, если я делаю запрос для одного пользователя и фильтрую по любому другому полю: - идентификатор, адрес электронной почты, имя пользователя.

Мое приложение настроено следующим образом:

datamodel.graphql (prisma)

type User {
  id: ID! @id @unique
  name: String!
  email: String! @unique
  username: String! @unique
  password: String!
  roles: [UserRoles!]!
}

enum UserRoles {
  ADMIN
  USER
  DIRECTOR
}

schema.graphql (react / apollo)

type User {
  id: ID!
  name: String!
  email: String!
  username: String!
  password: String!
  roles: [UserRoles!]!
}

enum UserRoles {
  ADMIN
  USER
  DIRECTOR
}

Mutation. js (внешний интерфейс преобразователей)

async loginUser(parent, args, { prisma }, info) {
    const { username, password } = args.data;
    const user = await prisma.query.user({ where: { username } });

    if (!user) {
      throw new Error("Invalid login credentials. Please try again");
    }

    const passwordIsMatch = await bcrypt.compare(password, user.password);

    if (!passwordIsMatch) {
      throw new Error("Invalid login credentials. Please try again");
    }

    return {
      user,
      token: generateToken(user.id),
    };
  },

Если я запустил мутацию входа в систему как-то так он работает нормально.

mutation LoginUser($username: String!, $password: String!){
  loginUser(data: {
    username: $username
    password: $password
  }) {
    user {
      id
      name
    }
    token
  }
}

Но если я запустил его вот так, он выйдет из строя с сообщением «Невозможно вернуть значение null для поля User.roles, не допускающего значения NULL».

mutation LoginUser($username: String!, $password: String!){
  loginUser(data: {
    username: $username
    password: $password
  }) {
    user {
      id
      name
      roles
    }
    token
  }
}

Есть идеи, как это исправить? Или мне следует дождаться ответа на эту мутацию, а затем запустить запрос для пользователя с возвращенным идентификатором, а затем извлечь из него поле «роли»? Мне это кажется немного излишним, поскольку я думал, что одним из больших преимуществ GraphQL является минимизация количества HTTP-запросов.

1 Ответ

0 голосов
/ 19 июня 2020

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

Чтобы пройти проверку, вам необходимо изменить поле spe c необязательно в схемах GraphQL и Prisma (удалите ! s):

  roles: [UserRoles]
...