我得到'变量'$data'"用户创建输入"类型的预期值!尝试Prisma GraphQL 'createUser' 时



不久前,我用GraphQL-Yoga和Prisma做了几个网站,现在正在尝试用Apollo Express做同样的事情。 一切正常。 然而,现在我无法开始这件事 - 也许我走得太快了,一次尝试了太多的事情。 我开始尝试按照本指南实施注册突变。 我的第一个(目前也是唯一的(突变是

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 操场上测试它时

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

我的数据模型是

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
  }
})

此外,错误说:"原因:"名称"预期的非空值,发现空",但你只给出usernamepassword。你忘了传递name值吗?

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

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
    },
  },

最新更新