Я использую 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 ^"
ОБНОВЛЕНИЕ 1 Пытался использовать фрагмент, но получил то же самое:
{
users {
...userFields
}
}
fragment userFields on User {
email
}
используйте fragments
@xadm То же самое { users { ...userFields } } fragment userFields on User { email }
... клонировать тип пользователя в UserInput (для использования mutate/creation), удалить пароль из типа пользователя
@xadm, не могли бы вы привести небольшой пример?


...аааа Призма...
Я не знаю, поддерживаются ли интерфейсы, объединения или типы ввода. График документы
Prisma генерирует почти все ... но определение пароля по мере необходимости (как тип для генерации DBB) для модели данных не должно блокировать запрос подмножества типов или типов, определенных в существующей модели, без использования всех полей.
Для меня это немного вводящее в заблуждение сообщение об ошибке. Это может быть связано с резольвером.
Попробуйте match типы в преобразователе, не возвращайте прямой запрос prisma (работает с типами моделей), а сопоставляйте запрошенные данные (массив), чтобы отфильтровать поле/свойство пароля (чтобы быть совместимым с типом запроса). Это также проблема безопасности — пароли не должны считываться извне.
Да, я создал собственный запрос, который возвращает фрагмент, и кажется, что ошибка исчезла.
Я создал собственный запрос, который возвращает фрагмент, и кажется, что ошибка исчезла.
Я также хотел бы добавить сценарий, который может очень легко вызвать ту же проблему, отладка которой заняла у меня некоторое время, и я уверен, что другие столкнутся с ней, потому что мне потребовалось довольно много времени, чтобы понять, что проблема на самом деле была вызвана в моем Код 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
}
}
`
Поэтому, если вы столкнулись с этой проблемой, проверьте ВСЕ ваши соответствующие мутации и убедитесь, что вы не возвращаете какие-либо поля, которые вы защитили, как я описал здесь.
Не забудьте также проверить код внешнего интерфейса и убедиться, что вы не пытаетесь вернуть поля, которые вы теперь защитили и больше не предоставляете внешнему интерфейсу.
Я надеюсь, что это полезно и сэкономит людям время!
Просто запустите в консоли (в папке prisma):
PRISMA_MANAGEMENT_API_SECRET=mysecret42 prisma deploy
Когда я убрал поле пароля - все работает, но мне нужно это поле для создания пользователя.