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));
誰かが私を助けてくれますか?
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 }),
}));
エラー出力に関して 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 の最新バージョンは、この機能の仕様に準拠しています ここ を確認してください。
Glennの答えを補足するために、 here は、エラーの処理方法を定義するGraphql Specの一部です。したがって、リクエストが失敗した(または部分的に失敗した)かどうかを確認するには、レスポンスのルートで「エラー」キーを確認します。