如何在graphql解析器中同时返回错误和数据?

Le *_*con 10 node.js apollo graphql-js

我正在考虑实现同时包含错误和数据的 graphql 响应的方法。

是否可以在不创建包含error?

例如

MutationaddMembersToTeam(membersIds: [ID!]! teamId: ID!): [Member]将成员添加到某个团队。假设这种突变被称为有以下membersIds[1, 2, 3]

id为1和2的成员已经在团队中,所以必须抛出无法添加这些成员的错误,但应该添加id为3的成员,因为他不在团队中。

我正在考虑使用,formatResponse但似乎我无法在那里得到错误。

是否可以在不向返回类型添加错误字段的情况下解决此问题?

Dan*_*den 9

是否可以在不向返回类型添加错误字段的情况下解决此问题?

抱歉不行。

解析器可以返回数据,也可以返回 null 并抛出错误。它不能两者兼而有之。澄清一下可能会得到部分响应和一些错误。一个简单的例子:

const typeDefs = `
  type Query {
    foo: Foo
  }

  type Foo {
    a: String
    b: String
  }
`
const resolvers = {
  Query: {
    foo: () => {},
  }
  Foo: {
    a: () => 'A',
    b: () => new Error('Oops!'),
  }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,查询两个字段foo将导致以下响应:

{
  "data": {
    "foo": {
      "a": "A",
      "b": null
    }
  },
  "errors": [
    {
      "message": "Oops",
      "locations": [
        {
          "line": 6,
          "column": 5
        }
      ],
      "path": [
        "foo",
        "b"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,可以同时发回数据和错误。但是你不能在同一个领域这样做,就像你的问题一样。有几种方法可以解决这个问题。正如您所指出的,您可以将错误作为响应的一部分返回,这通常是这样做的。然后formatResponse,您可以使用、遍历结果数据、提取任何错误并将它们与任何其他 GraphQL 错误结合起来。不是最优的,但它可能会让你得到你正在寻找的行为。

另一种选择是修改突变,使其采用单个成员 ID。然后,您可以为要添加的每个 id 请求单独的更改:

add1: addMemberToTeam(memberId: $memberId1 teamId: $teamId): {
  id
}
add2: addMemberToTeam(memberId: $memberId2 teamId: $teamId): {
  id
}
add3: addMemberToTeam(memberId: $memberId3 teamId: $teamId): {
  id
}
Run Code Online (Sandbox Code Playgroud)

这在处理客户端时可能会比较棘手,当然效率也较低,但同样可能会让您获得预期的行为。

  • @DanDascalescu 听起来你的字段不可为空。如果在字段的解析器中抛出执行错误,则该字段将解析为 null...但如果该字段不可为空,则其父级将解析为 null,因为不可为空的字段不能为 null。如果父字段也是不可空的,那么它的父字段将解析为空......依此类推,直到我们点击“data”。请参阅规范中的[此处](http://spec.graphql.org/June2018/#sec-Errors-and-Non-Nullability)。 (2认同)