在graphql-yoga中定义一个Mutation参数

时间:2019-02-10 02:12:04

标签: node.js graphql

如何为graphql-yoga中定义为解析器的参数创建一个Mutation,

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。

更新

我正在使用:

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 :(得分:2)

根据您的类型定义:

  1. createProject突变不包含任何参数:
type Mutation {
  createProject: ProjectMutationResult
}
  1. 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!

然后,假设您想从突变中检索新创建的项目ID和名称,请将突变本身更改为:

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

您需要执行此操作,因为您的createProject变异返回一个ProjectMutationResult,它本身包含一个project类型的Project字段,该字段定义了{{1 }}和id字段。