GraphQL - 如何响应不同的状态码?

新手上路,请多包涵

我在使用 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));

有谁能够帮我?

原文由 saeta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 871
2 个回答

在 GraphQL 中(至少在 graphql-js 中)返回错误的方法是在 resolve 函数中抛出错误。由于 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 }),
}));

原文由 helfer 发布,翻译遵循 CC BY-SA 3.0 许可协议

最近有一个关于错误输出的 规范

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 符合此功能的规范,请查看 错误处理

原文由 Glenn Sonna 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题