Я получаю ожидаемое значение переменной '$ data' типа 'UserCreateInput!' 'При попытке 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 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
}

Я уверен, что мне не хватает чего-то ослепительно очевидного, но, посмотрев некоторое время, я этого не вижу - так что любая подсказка будет очень признательна!


person Cerulean    schedule 28.04.2019    source источник


Ответы (2)


Метод createUser клиента Prisma нуждается в одном аргументе объекта, который затем содержит различные объекты, требуемые Prisma.

Правильный способ вызова метода выглядит так:

const user = await ctx.prisma.createUser({
  data: {
    username,
    password: hashedPassword,
  }
})

Такой способ структурирования аргументов помогает обеспечить согласованность с другими запросами:

E.g.:

const user = await ctx.prisma.updateUser({
  where: {
    name: "John Doe"
  },
  data: {
    password: newPassword
  }
})

Более того, в сообщении об ошибке говорится: «Причина: 'имя' Ожидаемое ненулевое значение, найдено нулевое значение». но вы даете только username и password. Вы забыли передать значение name?

person Errorname    schedule 29.04.2019
comment
Спасибо. Я изменил его, как вы предлагали ниже, но все равно получаю ту же ошибку. 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 }, }, } - person Cerulean; 29.04.2019
comment
Когда я ввел в игровую площадку следующую мутацию: mutation { register(username:"foo",password: "barr") { id username } - person Cerulean; 29.04.2019
comment
Хм, ошибка говорит: Причина: 'name' Ожидаемое ненулевое значение, найдено нулевое значение. но вы указываете только имя пользователя и пароль. Вы забыли передать значение имени? - person Errorname; 29.04.2019

Ответ, на который намекнул @Errorname в комментарии и данный мне пользователем на форуме Prisma Spectrum (я сам этого не видел), заключается в том, что существует несоответствие между моделью данных Prisma и схемой GraphQL. То есть поле называлось «имя пользователя» в схеме и «имя» в модели данных. Я изменил его на «имя пользователя» в модели данных. Дох!

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

и он отлично работает! Мне не нужно было добавлять объект data в createUser, как это было предложено @Errorname выше, то есть это отлично работает

 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
    },
  },
person Cerulean    schedule 29.04.2019