尝试 Prisma GraphQL 'createUser' 时得到 'Variable '$data' 类型 'UserCreateInput!'' 的期望值
Am getting 'Variable '$data' expected value of type 'UserCreateInput!'' when attempting Prisma GraphQL 'createUser'
不久前,我用 GraphQL-Yoga 和 Prisma 做了几个网站,现在正在尝试用 Apollo Express 做同样的事情。一切正常。然而,现在我无法开始这件事——也许我走得太快了,同时尝试了太多事情。我开始尝试按照 this 指南实施注册变更。我的第一个(也是目前唯一的)突变是
const resolvers = {
Mutation: {
register: async (parent, { username, password }, ctx, info) => {
const hashedPassword = await bcrypt.hash(password, 10)
const user = await ctx.prisma.createUser({
username,
password: hashedPassword,
})
return user
},
},
}
但是当我在 GraphQL Playground 中测试它时
mutation {
register(username:"foo",password: "bar") {
id
username
}
}
我收到这个错误
"errors": [
{
"message": "Variable '$data' expected value of type 'UserCreateInput!' but got: {\"username\":\"sandor\",\"password\":\"a$S7IF1L3YjS4dLUm8QB2zjenPnKHwlohml7AaPf1iVhNipHSkNb/62\"}. Reason: 'name' Expected non-null value, found null. (line 1, column 11):\nmutation ($data: UserCreateInput!) {\n ^",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"register"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
我查看了“generated/prisma-client/prisma-schema”,发现我有
createUser(data: UserCreateInput!): User!
但是当我之前使用 Prisma 时,当我向它传递一个对象时,它从来没有抱怨期望输入类型。我哪里错了?
我的架构是
const { gql } = require('apollo-server-express');
const typeDefs = gql`
type User {
id: ID!
username: String!
password: String!
}
type Query {
currentUser: User!
}
type Mutation {
register(username: String!, password: String!): User!
login(username: String!, password: String!): LoginResponse!
}
type LoginResponse {
id: ID!
token: String
user: User
}
`
module.exports = typeDefs
我的 datamodel.prisma 是
type User {
id: ID! @id
name: String!
password: String!
}
type LoginResponse {
id: ID! @id
token: String
user: User
}
我确信我遗漏了一些非常明显的东西,但看了一段时间后我没有看到它——所以任何线索都将不胜感激!
Prisma客户端的createUser
方法需要一个对象参数,然后包含Prisma所需的不同对象。
方法的正确调用方式是这样的:
const user = await ctx.prisma.createUser({
data: {
username,
password: hashedPassword,
}
})
这种构造参数的方式有助于确保与其他查询的一致性:
例如:
const user = await ctx.prisma.updateUser({
where: {
name: "John Doe"
},
data: {
password: newPassword
}
})
此外,错误显示:"Reason: 'name' Expected non-null value, found null." 但您只提供 username
和 password
。您是否忘记传递 name
值?
答案——@Errorname 在评论中暗示并由 Prisma Spectrum 论坛上的用户提供给我(我自己没有看到),是 Prisma 数据模型和GraphQL 模式。也就是说,该字段在模式中被称为 'username',在数据模型中被称为 'name'。我在数据模型中将其更改为 'username'。呸!
type User {
id: ID! @id
username: String!
password: String!
}
而且效果很好!正如上面@Errorname 所建议的那样,我不需要将 'data' 对象添加到 createUser——也就是说,这工作正常
Mutation: {
register: async (parent, {username, password}, ctx, info) => {
const hashedPassword = await bcrypt.hash(password, 10)
const user = await ctx.prisma.createUser({
username,
password: hashedPassword,
})
return user
},
},
不久前,我用 GraphQL-Yoga 和 Prisma 做了几个网站,现在正在尝试用 Apollo Express 做同样的事情。一切正常。然而,现在我无法开始这件事——也许我走得太快了,同时尝试了太多事情。我开始尝试按照 this 指南实施注册变更。我的第一个(也是目前唯一的)突变是
const resolvers = {
Mutation: {
register: async (parent, { username, password }, ctx, info) => {
const hashedPassword = await bcrypt.hash(password, 10)
const user = await ctx.prisma.createUser({
username,
password: hashedPassword,
})
return user
},
},
}
但是当我在 GraphQL Playground 中测试它时
mutation {
register(username:"foo",password: "bar") {
id
username
}
}
我收到这个错误
"errors": [
{
"message": "Variable '$data' expected value of type 'UserCreateInput!' but got: {\"username\":\"sandor\",\"password\":\"a$S7IF1L3YjS4dLUm8QB2zjenPnKHwlohml7AaPf1iVhNipHSkNb/62\"}. Reason: 'name' Expected non-null value, found null. (line 1, column 11):\nmutation ($data: UserCreateInput!) {\n ^",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"register"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
我查看了“generated/prisma-client/prisma-schema”,发现我有
createUser(data: UserCreateInput!): User!
但是当我之前使用 Prisma 时,当我向它传递一个对象时,它从来没有抱怨期望输入类型。我哪里错了?
我的架构是
const { gql } = require('apollo-server-express');
const typeDefs = gql`
type User {
id: ID!
username: String!
password: String!
}
type Query {
currentUser: User!
}
type Mutation {
register(username: String!, password: String!): User!
login(username: String!, password: String!): LoginResponse!
}
type LoginResponse {
id: ID!
token: String
user: User
}
`
module.exports = typeDefs
我的 datamodel.prisma 是
type User {
id: ID! @id
name: String!
password: String!
}
type LoginResponse {
id: ID! @id
token: String
user: User
}
我确信我遗漏了一些非常明显的东西,但看了一段时间后我没有看到它——所以任何线索都将不胜感激!
Prisma客户端的createUser
方法需要一个对象参数,然后包含Prisma所需的不同对象。
方法的正确调用方式是这样的:
const user = await ctx.prisma.createUser({
data: {
username,
password: hashedPassword,
}
})
这种构造参数的方式有助于确保与其他查询的一致性:
例如:
const user = await ctx.prisma.updateUser({
where: {
name: "John Doe"
},
data: {
password: newPassword
}
})
此外,错误显示:"Reason: 'name' Expected non-null value, found null." 但您只提供 username
和 password
。您是否忘记传递 name
值?
答案——@Errorname 在评论中暗示并由 Prisma Spectrum 论坛上的用户提供给我(我自己没有看到),是 Prisma 数据模型和GraphQL 模式。也就是说,该字段在模式中被称为 'username',在数据模型中被称为 'name'。我在数据模型中将其更改为 'username'。呸!
type User {
id: ID! @id
username: String!
password: String!
}
而且效果很好!正如上面@Errorname 所建议的那样,我不需要将 'data' 对象添加到 createUser——也就是说,这工作正常
Mutation: {
register: async (parent, {username, password}, ctx, info) => {
const hashedPassword = await bcrypt.hash(password, 10)
const user = await ctx.prisma.createUser({
username,
password: hashedPassword,
})
return user
},
},