2017-03-21 11 views
1

GraphqlとApollo Clientに問題があります。GraphQL - さまざまなステータスコードで対応する方法

私はRESTを使用しているときに、常に401コードのようなdifferentsレスポンスを作成しましたが、ここで私はどのように同様の動作をするのか分かりません。

私が応答を受け取ったら、それはcatch機能に行きたいと思っています。 私は前にこのコードを持っている:

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

誰も私を助けることができますか?

答えて

6

GraphQLのエラーを(少なくともgraphql-jsで)返す方法は、解決関数内にエラーを投げることです。 HTTPステータスコードはHTTPトランスポートに固有であり、GraphQLはトランスポートを気にしないので、そこでステータスコードを設定する方法はありません。あなたが代わりに行うことができますことはあなたの決意関数内の特定のエラーがスローされます。メッセージは十分な情報がない場合には、

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

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

GraphQLエラーがそうのように対応してクライアントに送信されますステータスコードを含むGraphQLサーバ用の特別なエラークラスを作成することができます。ステータスコードは、あなたの応答に含まれているか確認するには、ミドルウェアを作成するときにformatError関数を指定する必要があります:

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

ありがとうhelfer、それは非常に便利です。 – slorenzo