GraphQL мутация - путаница в разработке тега gql для клиента Apollo - PullRequest
1 голос
/ 28 февраля 2020

Мне нужна помощь в определении тега GraphQL для использования с клиентом Apollo. Документы не go далеко выходят за рамки базового c варианта использования мутаций.

Моя цель состоит в том, чтобы единственным обязательным вводом был адрес электронной почты. Если присутствуют другие переменные, я бы хотел, чтобы они были приняты и создали предложение со всей этой информацией.

У меня есть мутация (в сценарии только с электронной почтой и сценарием с полными переменными ios), успешно работающая на GraphQl Playground (если это поможет, вы можете найти его здесь и проверить его, посмотрите на схему, et c.,): https://prisma2-graphql-yoga-shield.now.sh/playground)

mutation {
  createOneProposal(
    data: {
      email: "fake@gmail.com"
      name: "Sean"
      types: {
        create: {
          model: PURCHASE
          name: "e-commerce"
          cost: 600
          services: {
            create: [
              { service: "Responsive web design" }
              { service: "Another service!" }
              { service: "And yet another service!" }
            ]
          }
        }
      }
    }
  ) {
    created_at
    proposal_id
    types {
      cost
      model
      name
      type_id
      services {
        service
        service_id
      }
    }
  }
}

Производство в результате:

{
  "data": {
    "createOneProposal": {
      "created_at": "2020-02-27T21:28:53.256Z",
      "proposal_id": 35,
      "types": [
        {
          "cost": 600,
          "model": "PURCHASE",
          "name": "e-commerce",
          "type_id": 6,
          "services": [
            {
              "service": "Responsive web design",
              "service_id": 10
            },
            {
              "service": "Another service!",
              "service_id": 11
            },
            {
              "service": "And yet another service!",
              "service_id": 12
            }
          ]
        }
      ]
    }
  }
}

Мой первоначальный дизайн тега gql:

export const NEW_PROPOSAL = gql`
  mutation createOneProposal(
    $email: String!
    $name: String
    $cost: Int
    $model: Model
    $service: Service
  ) {
    createOneProposal(
      email: $email
      name: $name
      cost: $cost
      model: $model
      service: $service
    ) {
      created_at
      proposal_id
      types {
        services {
          service_id
        }
      }
    }
  }
`;

Но я получаю много ошибок с этим.

{"errors":[
{"Variable "$service" cannot be non-input type `"Service`".","locations":[{"line":1,"column":97}]},
{"Unknown argument "email" on field "createOneProposal`" of type "Mutation`".","locations":[{"line":2,"column":21}]},
{"Unknown argument "name" on field "createOneProposal`" of type "Mutation`".","locations":[{"line":2,"column":36}]},
{"Unknown argument"cost" on field "createOneProposal\" of type "Mutation`".","locations":[{"line":2,"column":49}]},
{"Unknown argument "model" on field "createOneProposal`" of type "Mutation`".","locations":[{"line":2,"column":62}]},
{"Unknown argument "service" on field "createOneProposal`" of type "Mutation`".","locations":[{"line":2,"column":77}]},
{"Field "createOneProposal" argument "data" of type "ProposalCreateInput!`" is required, but it was not provided.","locations":[{"line":2,"column":3}]}]}

Итак, как я могу go об этом ... Я выяснил версию запроса (намного проще ...), но я просто не могу понять это!

Моя схема, если это поможет:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("MYSQL_URL_PRISMA2")
}

model Post {
  content      String    @default("")
  created_at   DateTime  @default(now())
  post_id      Int       @default(autoincrement()) @id
  published    Boolean   @default(false)
  published_at DateTime?
  title        String    @default("")
  author       User
}

model Profile {
  bio        String?
  profile_id Int     @default(autoincrement()) @id
  user_id    User
}

model Proposal {
  email       String   @unique
  name        String?
  proposal_id Int      @default(autoincrement()) @id
  created_at  DateTime @default(now())
  types       Type[]
}

model Type {
  cost        Int?
  name        String?
  model       Model?    @default(SUBSCRIPTION)
  services    Service[]
  type_id     Int       @default(autoincrement()) @id
  proposal_id Proposal
}

model Service {
  service_id Int     @default(autoincrement()) @id
  service    String?
  type_id    Type
}

model User {
  email    String    @default("") @unique
  name     String    @default("")
  password String    @default("")
  role     Role      @default(USER)
  user_id  Int       @default(autoincrement()) @id
  posts    Post[]
  profiles Profile[]
}

enum Role {
  USER ADMIN
}

enum Model {
  SUBSCRIPTION PURCHASE CUSTOM
}

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Благодаря очень нужному направлению от @xadm я выяснил структуру тега! Для тех, кто сталкивается с этим в будущем:

mutation createOneProposal($input: ProposalCreateInput!){
    createOneProposal(data:$input){
        created_at
    name
    email
    proposal_id
    type{
      cost
      description
      model
      name
      type_id
      services{
        service
        cost
        service_id
      }
    }
      }
    }

0 голосов
/ 28 февраля 2020

Типы GraphQL подразделяются на типы ввода или типы вывода . Типы ввода используются для входных данных, таких как определения переменных или определения аргументов. Типы вывода используются для ввода полей, которые составляют фактический ответ. Некоторые типы, такие как скаляры и перечисления, могут использоваться как входные или выходные данные. Однако для объектов существуют типы выходных объектов (иногда называемые просто типами объектов или объектами) и типы входных объектов.

Service является типом вывода, поэтому его нельзя использовать там, где тип ввода ожидается (в этом случае определение переменной). Изучите схему, созданную Prisma, чтобы определить подходящий тип для использования.

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