Не удается запросить поле «пароль» для типа «Пользователь» graphql

Я использую graphql и prisma.

модель данных.prisma

type User {
  id: ID! @id
  createdAt: DateTime! @createdAt
  updatedAt: DateTime! @updatedAt
  email: String! @unique
  password: String!
  first_name: String
}

схема.graphql

scalar Date

type Query {
  users: [User!]!
}

type User {
  id: ID!
  createdAt: Date!
  updatedAt: Date!
  email: String!
  first_name: String
}

резольвер

users: (parent, args, context) => {
  return context.prisma.users();
}

Я ожидал получить список пользователей, но получил ошибку: запрос

{
  users {
    email
  }
}

ошибка

"Cannot query field 'password' on type 'User'. (line 7, column 5):\n password\n ^"

Не удается запросить поле «пароль» для типа «Пользователь» graphql

ОБНОВЛЕНИЕ 1 Пытался использовать фрагмент, но получил то же самое:

{
  users {
    ...userFields
  }
}

fragment userFields on User {
  email
}

Когда я убрал поле пароля - все работает, но мне нужно это поле для создания пользователя.

demkovych 23.05.2019 10:19

используйте fragments

xadm 23.05.2019 10:36

@xadm То же самое { users { ...userFields } } fragment userFields on User { email }

demkovych 23.05.2019 10:41

... клонировать тип пользователя в UserInput (для использования mutate/creation), удалить пароль из типа пользователя

xadm 23.05.2019 10:53

@xadm, не могли бы вы привести небольшой пример?

demkovych 23.05.2019 11:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
5
5 196
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

...аааа Призма...

Я не знаю, поддерживаются ли интерфейсы, объединения или типы ввода. График документы

Prisma генерирует почти все ... но определение пароля по мере необходимости (как тип для генерации DBB) для модели данных не должно блокировать запрос подмножества типов или типов, определенных в существующей модели, без использования всех полей.

Для меня это немного вводящее в заблуждение сообщение об ошибке. Это может быть связано с резольвером.

Попробуйте match типы в преобразователе, не возвращайте прямой запрос prisma (работает с типами моделей), а сопоставляйте запрошенные данные (массив), чтобы отфильтровать поле/свойство пароля (чтобы быть совместимым с типом запроса). Это также проблема безопасности — пароли не должны считываться извне.

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

demkovych 24.05.2019 09:37
Ответ принят как подходящий

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

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

Настраивать

Вот как это выглядело при разработке большей части моего приложения:

datamodel.prisma (для простоты я опустил некоторые поля)

type User {
  id: ID! @id
  name: String!
  email: String! @unique
  password: String!
}

schema.graphql (для простоты показана мутация signUp)

type Mutation {
  signUp(email: String!, password: String!, name: String!): User!
}

SignUp.js (где я получаю доступ к signUp Мутации, обнаруженной в schema.graphql)

const SIGNUP_MUTATION = gql`
  mutation SIGNUP_MUTATION(
    $email: String!
    $name: String!
    $password: String!
  ) {
    signUp(email: $email, name: $name, password: $password) {
      id
      email
      name
      password
    }
  }
`

Обратите внимание, что я возвращаю id, email, name и password — это потому, что я хотел убедиться, что все работает в процессе разработки.


Представляем ошибку Cannot query field 'password' on type 'User'

Как только я начал работать над безопасностью и создал специальный тип User в schema.graphql, чтобы я мог скрывать защищенные поля, такие как password, у меня возникла эта проблема:

schema.graphql (обратите внимание, что я теперь не показываю поле password для этого типа пользователя, обращенного к внешнему интерфейсу)

type Mutation {
  signUp(email: String!, password: String!, name: String!): User!
}

type User {
  id: ID!
  name: String!
  email: String!
}

Решение

Из-за характера этого сообщения об ошибке я провел большую часть утра, ломая голову над своим внутренним кодом. Но оказалось, что ошибка на самом деле была вызвана в SignUp.js, где я ВОЗВРАЩАЛ поле password.

Решение состояло в том, чтобы просто удалить эту строку из списка возвращаемых полей следующим образом:

const SIGNUP_MUTATION = gql`
  mutation SIGNUP_MUTATION(
    $email: String!
    $name: String!
    $password: String!
  ) {
    signUp(email: $email, name: $name, password: $password) {
      id
      email
      name
    }
  }
`

Ключевые уроки

  1. Поэтому, если вы столкнулись с этой проблемой, проверьте ВСЕ ваши соответствующие мутации и убедитесь, что вы не возвращаете какие-либо поля, которые вы защитили, как я описал здесь.

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

Я надеюсь, что это полезно и сэкономит людям время!

Просто запустите в консоли (в папке prisma):

PRISMA_MANAGEMENT_API_SECRET=mysecret42 prisma deploy

Другие вопросы по теме