1

apollo-server-expressゲートウェイ アプリケーションとして実行しています。makeRemoteExecutableSchemaapollo-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 の場合を含む)、応答のエラー エントリには、実行中に発生したエラーが含まれている可能性があります。実行中にエラーが発生した場合は、それらのエラーが含まれている必要があります。

4

0 に答える 0