我正在使用graphql和pyramida。
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
}
答案 0 :(得分:1)
我还想添加一个场景,该场景很容易导致同一问题,这使我花了一些时间进行调试,而且我敢肯定会遇到其他问题,因为花了我很多时间才意识到问题实际上是是由于我在定义与身份验证相关的Mutations的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 :(得分:0)
... aaah Prisma ...
我不知道是否支持接口,联合或输入类型。 Graphql docs
Prisma几乎可以生成所有内容……但是,如果需要为数据模型定义密码(作为DBB生成的类型),则不应在不使用所有字段的情况下阻止查询现有模型中定义的类型子集或类型。
对我来说,这是一个误导性的错误消息。可以与解析器相关。
尝试在解析器中输入match
类型,不返回直接的棱柱形查询(对模型类型进行操作),但是映射查询的数据(数组)以过滤出密码字段/属性(与查询类型兼容) 。这也是一个安全问题-不应从外部读取密码。
答案 2 :(得分:0)
我创建了自定义查询,该查询返回一个片段,并且错误似乎消失了。
答案 3 :(得分:0)
只需在您的控制台中运行(在pyramida文件夹中):
PRISMA_MANAGEMENT_API_SECRET=mysecret42 prisma deploy