Определение аргумента мутации в графике йоги - PullRequest
0 голосов
/ 10 февраля 2019

Как создать мутацию с аргументами для резольвера, определенного в graphql-yoga как:

const resolvers =
  Mutation: {
    createProject(root, args) {
      const id = (Number(last(data.projects).id) + 1).toString()
      const newProject = { ...args, id: id }
      ...

Я пробовал следующее:

mutation CreateProject($name: String!) {
  createProject {
    data: {
      name: $name
    }
  }
}

и

mutation CreateProject($name: String!) {
  createProject($name: name) {
    statusCode
  }
}

, который производит

enter image description here

и различные другие структуры безуспешно.

Кажется, что нет никакой ссылки на мутациюлибо в проекте README, либо в любом из трех примеров.

Обновление

Я сейчас использую:

mutation CreateProject($name: String!) {
  createProject(name: $name) {
    id
    name
  }
}

, который так похожк примерам, которые я видел в сети, я считаю, что он должен быть действительным, а синтаксис не отклонен.

Определение схемы:

  scalar ID

  type Project {
    id: ID
    type: ProjectType
    name: String
  }

  interface MutationResult {
    statusCode: Int
    message: String
  }

  type ProjectMutationResult implements MutationResult {
    statusCode: Int
    message: String
    project: Project
  }

  type Mutation {
    createProject: ProjectMutationResult
  }

Однако при отправке мутации яполучить:

{
  "error": {
    "errors": [
      {
        "message": "Unknown argument \"name\" on field \"createProject\" of type \"Mutation\".",
        "locations": [
          {
            "line": 2,
            "column": 17
          }
        ]
      },
      {
        "message": "Cannot query field \"id\" on type \"ProjectMutationResult\".",
        "locations": [
          {
            "line": 3,
            "column": 5
          }
        ]
      },
      {
        "message": "Cannot query field \"name\" on type \"ProjectMutationResult\".",
        "locations": [
          {
            "line": 4,
            "column": 5
          }
        ]
      }
    ]
  }
}

1 Ответ

0 голосов
/ 10 февраля 2019

В соответствии с определением вашего типа:

  1. Мутация createProject не требует аргументов:
type Mutation {
  createProject: ProjectMutationResult
}
Тип ProjectMutationResult не имеет ни поля id, ни поля name:
type ProjectMutationResult implements MutationResult {
  statusCode: Int
  message: String
  project: Project
}

Поэтому, когда вы запускаете мутацию:

mutation CreateProject($name: String!) {
  createProject(name: $name) {
    id
    name
  }
}

у вас есть полное несоответствие между тем, что вы используете на своем сервере GraphQL, и тем, что он на самом деле ожидает.

Итак, прежде всего, если вы хотите иметь возможность установить name для своего проекта при созданииэто, вам нужно изменить ваше определение createProject на это:

type Mutation {
  createProject(name: String!): ProjectMutationResult
}

(если вы хотите, чтобы присвоение имен было необязательным, установите имя типа String вместо String!)

Затем, если вы хотите получить вновь созданный идентификатор проекта и имя из вашей мутации, измените саму мутацию на:

mutation CreateProject($name: String!) {
  createProject(name: $name) {
    project {
      id
      name
    }
  }
}

Это нужно сделать, потому что ваша мутация createProject возвращаетProjectMutationResult, которое само содержит поле project типа Project, которое определяет поля id и name.

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