Сервер Apollo, работающий в качестве шлюза, скрывает удаленную ошибку, если данные не равны нулю - PullRequest
1 голос
/ 22 мая 2019

Я использую 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

Если запись данных в ответе присутствует (в том числе, если это значение равно нулю), запись ошибок в ответе может содержать любые ошибки, возникшие во время выполнения. Если во время выполнения возникли ошибки, они должны содержать эти ошибки.

...