Я использую apollo-server-express
в качестве приложения шлюза. Настройка нескольких базовых приложений GraphQL с makeRemoteExecutableSchema
и apollo-link-http
.
Обычно каждый звонок просто работает. Если ошибка является частью ответа и данные равны нулю, это также работает. Но если данные содержат только данные, а ошибки содержат ошибку. Данные будут переданы, но ошибки пустые
const headerSet = setContext((request, previousContext) => {
return setHeaders(previousContext);
});
const errorLink = onError(({ response, forward, operation, graphQLErrors, networkError }) => {
if (graphQLErrors) {
graphQLErrors.map((err) => {
Object.setPrototypeOf(err, Error.prototype);
});
}
if (networkError) {
logger.error(networkError, 'A wild network error appeared');
}
});
const httpLink = new HttpLink({
uri: remoteURL,
fetch
});
const link = headerSet.concat(errorLink).concat(httpLink);
Пример A «Рабочий пример»:
Запрос
{
checkName(name: "namethatistoolooooooong")
}
Ответ на запрос
{
"errors": [
{
"message": "name is too long, the max length is 20 characters",
"path": [
"checkName"
],
"extensions": {
"code": "INPUT_VALIDATION_ERROR"
}
}
],
"data": null
}
Пример B "Ошибки скрыты":
Запрос
mutation inviteByEmail {
invite(email: "invalid!!!~~~test!--@example.com") {
status
}
}
Ответ от удаленного сервиса (httpLink)
response.errors
и graphQLErrors
в onError
метод также содержит ошибку
{
"errors": [
{
"message": "Email not valid",
"path": [
"invite"
],
"extensions": {
"code": "INPUT_VALIDATION_ERROR"
}
}
],
"data": {
"invite": {
"status": null
}
}
}
Ответ
{
"data": {
"invite": {
"status": null
}
}
}
В соответствии со спецификацией graphql я бы ожидал, что объект ошибок не будет скрыт, если он является частью ответа
https://graphql.github.io/graphql-spec/June2018/#sec-Errors
Если запись данных в ответе присутствует (в том числе, если это значение равно нулю), запись ошибок в ответе может содержать любые ошибки, возникшие во время выполнения. Если во время выполнения возникли ошибки, они должны содержать эти ошибки.