尝试 Prisma GraphQL 'createUser' 时,我得到类型为 'UserCreateInput!' 的变量 '$data' 预期值

Posted

技术标签:

【中文标题】尝试 Prisma GraphQL \'createUser\' 时,我得到类型为 \'UserCreateInput!\' 的变量 \'$data\' 预期值【英文标题】:Am getting 'Variable '$data' expected value of type 'UserCreateInput!'' when attempting Prisma GraphQL 'createUser'尝试 Prisma GraphQL 'createUser' 时,我得到类型为 'UserCreateInput!' 的变量 '$data' 预期值 【发布时间】:2019-09-17 12:16:14 【问题描述】:

不久前,我使用 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\":\"$2a$10$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",

我查看了“生成的/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

我确信我遗漏了一些非常明显的东西,但看了一段时间后我没有看到它——所以任何线索都会非常感激!

【问题讨论】:

【参考方案1】:

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
  
)

此外,错误显示:“原因:'name' 预期的非空值,发现为空。”但你只给usernamepassword。您是否忘记传递 name 值?

【讨论】:

谢谢-我按照您对以下内容的建议进行了更改,但仍然遇到相同的错误。 Mutation: register: async (parent, username, password, ctx, info) => const hashedPassword = await bcrypt.hash(password, 10) const user = await ctx.prisma.createUser( data: username, password: hashedPassword, ) return user , , 当我将以下突变放入操场时:mutation register(username:"foo",password: "barr") id username 嗯,错误说:“原因:'name'预期的非空值,发现空。”但您只提供用户名和密码。您是否忘记传递名称值?【参考方案2】:

答案——@Errorname 在评论中暗示并由 Prisma Spectrum 论坛上的用户给我(我自己没有看到),是 Prisma 数据模型和 GraphQL 之间存在差异架构。也就是说,该字段在模式中被称为“用户名”,在数据模型中被称为“名称”。我在数据模型中将其更改为“用户名”。呵呵!

type User 
  id: ID! @id
  username: String!
  password: String!

而且效果很好!正如上面@Errorname 所建议的那样,我不需要将“数据”对象添加到 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
    ,
  ,

【讨论】:

以上是关于尝试 Prisma GraphQL 'createUser' 时,我得到类型为 'UserCreateInput!' 的变量 '$data' 预期值的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL(Prisma)突变数据未定义

Prisma graphql updateNode 突变

模式拼接两个远程 Prisma/GraphQL 模式

使用 GraphQL 和 Prisma 级联删除相关节点

使用 GraphQL、Nexus 和 Prisma 优化 SQL 查询

Prisma GraphQL-Yoga:解析器需要异步吗?