Возможно ли решить эту проблему без добавления поля ошибки к типу возвращаемого значения?
К сожалению, нет.
Средство распознавания может либо вернуть данные, либо вернутьобнулить и выкинуть ошибку.Это не может сделать оба.Чтобы уточнить, можно получить частичный ответ и некоторые ошибки.Простой пример:
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.Затем вы можете запросить отдельную мутацию для каждого добавляемого вами идентификатора:
add1: addMemberToTeam(memberId: $memberId1 teamId: $teamId): {
id
}
add2: addMemberToTeam(memberId: $memberId2 teamId: $teamId): {
id
}
add3: addMemberToTeam(memberId: $memberId3 teamId: $teamId): {
id
}
Это может быть сложнее для обработки на стороне клиента и, конечно, менее эффективно, но опять-таки может привести к ожидаемому поведению.