是否可以在不给返回类型添加错误字段的情况下解决这个问题?
很遗憾,没有。
解析器可以返回数据,也可以返回 null 并引发错误。它不能两者兼得。澄清一下,可能得到部分响应和一些错误。一个简单的例子:
const typeDefs = `
type Query {
foo: Foo
}
type Foo {
a: String
b: String
}
`
const resolvers = {
Query: {
foo: () => {},
}
Foo: {
a: () => 'A',
b: () => new Error('Oops!'),
}
}
在本例中,查询foo 上的两个字段将产生以下响应:
{
"data": {
"foo": {
"a": "A",
"b": null
}
},
"errors": [
{
"message": "Oops",
"locations": [
{
"line": 6,
"column": 5
}
],
"path": [
"foo",
"b"
]
}
]
}
通过这种方式,可以同时发回数据和错误。但是你不能在同一个领域这样做,就像你的问题一样。有几种方法可以解决这个问题。正如您所指出的,您可以将错误作为响应的一部分返回,这通常是这样做的。然后,您可以使用formatResponse,遍历结果数据,提取任何错误并将它们与任何其他 GraphQL 错误结合起来。不是最佳的,但它可能会为您提供您正在寻找的行为。
另一种选择是修改突变,使其采用单个 memberId。然后,您可以为要添加的每个 id 请求单独的突变:
add1: addMemberToTeam(memberId: $memberId1 teamId: $teamId): {
id
}
add2: addMemberToTeam(memberId: $memberId2 teamId: $teamId): {
id
}
add3: addMemberToTeam(memberId: $memberId3 teamId: $teamId): {
id
}
这在处理客户端时可能会比较棘手,而且效率当然较低,但同样可能会为您带来预期的行为。