web-dev-qa-db-ja.com

GraphQL-異なるステータスコードで応答する方法

GraphqlとApolloクライアントで問題が発生しています。

RESTを使用するときは、401コードのような差分応答を常に作成しましたが、ここでは同様の動作を行う方法がわかりません。

応答を受け取ったら、catch関数に移動します。私はこのコードを前に持っています:

client.query({
  query: gql`
    query TodoApp {
      todos {
        id
        text
        completed
      }
    }
  `,
})
  .then(data => console.log(data))
  .catch(error => console.error(error));

誰かが私を助けてくれますか?

13
slorenzo

GraphQL(少なくともgraphql-js)でエラーを返す方法は、解決関数内でエラーをスローすることです。 HTTPステータスコードはHTTPトランスポートに固有であり、GraphQLはトランスポートを気にしないので、そこにステータスコードを設定する方法はありません。代わりにできることは、resolve関数内で特定のエラーをスローすることです。

age: (person, args) => {
  try {
    return fetchAge(person.id);
  } catch (e) {
    throw new Error("Could not connect to age service");
  }
}

GraphQLエラーは、次のような応答でクライアントに送信されます。

{
  "data": {
    "name": "John",
    "age": null
  },
  "errors": [
    { "message": "Could not connect to age service" }
  ]
}

メッセージが十分な情報でない場合は、ステータスコードを含むGraphQLサーバー用の特別なエラークラスを作成できます。ステータスコードが応答に含まれるようにするには、ミドルウェアを作成するときにformatError関数を指定する必要があります。

app.use('/graphql', bodyParser.json(), graphqlExpress({ 
    schema: myGraphQLSchema,
    formatError: (err) => ({ message: err.message, status: err.status }),
}));
22
helfer

エラー出力に関して spec に最近追加されました:

GraphQLサービスは、キーextensionsのエラーへの追加エントリを提供する場合があります。このエントリが設定されている場合、その値としてマップが必要です。このエントリは、実装者がエラーに追加情報を追加するために予約されていますが、適切と思われ、その内容に追加の制限はありません。

extensionsフィールドを使用して、errorsエントリに機械で読み取り可能な情報をカスタマイズできます。

{
  "errors": [
    {
      "message": "Name for character with ID 1002 could not be fetched.",
      "locations": [ { "line": 6, "column": 7 } ],
      "path": [ "hero", "heroFriends", 1, "name" ],
      "extensions": {
        "code": "CAN_NOT_FETCH_BY_ID",
        "timestamp": "Fri Feb 9 14:33:09 UTC 2018"
      }
    }
  ]
}

Apollo-Server の最新バージョンは、この機能の仕様に準拠しています ここ を確認してください。

6
Glenn Sonna

Glennの答えを補足するために、 here は、エラーの処理方法を定義するGraphql Specの一部です。したがって、リクエストが失敗した(または部分的に失敗した)かどうかを確認するには、レスポンスのルートで「エラー」キーを確認します。

0
David Revelo