При попытке получения Prisma GraphQL 'createUser' получаю ожидаемое значение типа 'Переменная' $ data 'типа' UserCreateInput! '' - PullRequest
1 голос
/ 28 апреля 2019

Я сделал несколько сайтов с 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",

Я заглянул в `generate / 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
}

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

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

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

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
    },
  },
0 голосов
/ 29 апреля 2019

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

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

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

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

Например:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...