apollo-server-express
ゲートウェイ アプリケーションとして実行しています。makeRemoteExecutableSchema
とapollo-link-http
. _
通常、すべての呼び出しが機能します。エラーが応答の一部であり、データが null の場合も機能します。ただし、データにデータのみが含まれ、エラーにはエラーが含まれる場合。データは渡されますが、エラーは空です
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
応答のデータ エントリが存在する場合 (値が null の場合を含む)、応答のエラー エントリには、実行中に発生したエラーが含まれている可能性があります。実行中にエラーが発生した場合は、それらのエラーが含まれている必要があります。