我在使用Graphql和Apollo Client时遇到了麻烦.
当我使用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中)是在resolve函数中抛出错误.由于HTTP状态代码特定于HTTP传输,而GraphQL不关心传输,因此您无法在那里设置状态代码.你可以做的是在你的解析函数中抛出一个特定的错误:
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 }), }));
规范中最近增加了有关错误输出的信息:
GraphQL服务可以通过键扩展为错误提供附加条目。如果设置了该条目,则其值必须具有一个映射。此项保留给实现者,以将其他信息添加到错误中,但是他们认为合适,并且对其内容没有任何其他限制。
现在,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符合此功能的规范,请在此处查看。