无法查询类型 'User' 上的字段 'password' graphql

Cannot query field 'password' on type 'User' graphql

我正在使用 graphql 和 prisma。

datamodel.prisma

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

schema.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
}

...啊啊棱镜...

我不知道是否支持接口、联合或输入类型。 Graphql docs

Prisma 生成几乎所有内容......但是根据需要为数据模型定义密码(作为 DBB 生成的类型)不应阻止查询类型子集或在不使用所有字段的情况下在现有模型上定义的类型。

对我来说,这是一个有点误导的错误信息。它可能与解析器相关。

尝试在解析器中match类型,不要return直接prisma查询(对模型类型进行操作),而是映射查询数据(数组)以过滤掉密码field/property(与查询类型兼容)。这也是一个安全问题 - 不应从外部读取密码。

我创建了自定义查询,其中 return 一个片段,似乎错误消失了。

我还想添加一个场景,它很容易导致我花了一些时间调试的同样问题,我相信其他人也会遇到,因为我花了很长时间才意识到这个问题是实际上是在我定义与身份验证相关的突变的前端代码中引起的。

设置

这是我开发大部分应用程序时的样子:

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(我访问 schema.graphql 中暴露的 signUp 突变)

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

请注意,我正在 returning idemailnamepassword - 这是因为我想确保一切正常从事开发工作。


引入 Cannot query field 'password' on type 'User' 错误

一旦我开始从事安全工作并在 schema.graphql 中创建了一个特殊的 User 类型,以便我可以隐藏受保护的字段,例如 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 字段。

解决方案是简单地从 return 字段列表中删除该行,如下所示:

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

重要经验教训

  1. 因此,如果您遇到此问题,请检查所有相关突变,并确保您没有 returning 任何您已保护的字段,如我在此处所述.

  2. 请务必同时检查您的前端代码,并确保您没有尝试 return 您现在已保护且不再向前端公开的字段。

我希望这对您有所帮助并节省人们一些时间!

只需 运行 在您的控制台中(在 prisma 文件夹中):

PRISMA_MANAGEMENT_API_SECRET=mysecret42 prisma deploy