GraphQL 是一种现代化的 API 技术,能够提升 API 的灵活性、可用性和可扩展性。GraphQL 不仅能够帮助开发者在一次 API 请求中获取到自己需要的数据,还能够优化前端与后端之间的数据传输和通信流程。然而,在实际开发中,GraphQL 的错误处理却是一个相对复杂的问题,因为 GraphQL 运行时错误信息并不太明确。本文将介绍如何优化 GraphQL 错误处理,让你的 GraphQL API 更加稳定、可靠。
问题分析
当我们在客户端向 GraphQL API 发送请求时,如果出现错误,我们很难知道具体的错误原因。相对于传统的 RESTful API,GraphQL API 在错误信息提示方面不够明确。而这也是因为 GraphQL 当中,所有的错误都是通过统一的错误对象来描述,如下所示:
// javascriptcn.com 代码示例 { "errors": [ { "message": "Requested field `abc` not found on type `Object`.", "locations": [ { "line": 4, "column": 3 } ], "path": [ "company", "employees", "0", "abc" ] } ] }
上述错误信息在描述了请求了不存在的字段,并返回了字段所在的路径和位置。这种错误提示虽然明确,但是我们无法精确定位错误位置以及错误类型。因此,优化 GraphQL 错误处理是非常必要的。
优化方式
为了优化 GraphQL 的错误处理,我们可以从以下方面入手:
1. 统一错误格式
将 GraphQL 返回错误放在最外层,以方便前端进行处理。可以根据 HTTP Status Code 来确定当前请求是否成功。
{ "data": null, "message": "ABC is no value!", "status": 404 }
2. 细分错误类型
GraphQL 的错误类别有很多种,例如类型错误、解析错误、运行时错误等等。对于不同类型的错误,我们可以针对性地给出错误提示信息。这样可以让前端更加明确和直观地了解到错误的原因和类型。
3. 错误信息重构
对于 GraphQL 返回的错误信息,我们可以根据具体的业务需求进行重构。例如,在查询历史记录时,我们可能需要返回错误的上下文信息及具体字段等。
// javascriptcn.com 代码示例 { "data": null, "message": "Request field `ABC` not found in `QueryHistoryType`.", "status": 404, "path": [ "QueryHistory", "ABC" ] }
4. 异常处理
在编写 GraphQL 服务端代码时,我们需要针对不同的错误进行异常处理。这样不仅可以使我们的代码更加健壮,还可以提高代码的可维护性。例如,我们可以用 try-catch 方式捕捉 GraphQL 运行时错误,从而有效地减少错误发生的可能性。
5. 合理的调试工具
GraphQL 也提供了一些方便我们调试的工具。例如,GraphiQL 工具是一个强大的,基于 Web 的 GraphQL IDE,它能够让我们快速调试和测试 GraphQL API。此外,还有一些其他的 GraphQL 工具,如 GraphQL Playground、Altair 等,都可以帮助我们方便地进行调试和测试。
示例代码
下面是一个简单的 GraphQL 查询示例,其中包含了错误处理的优化:
// javascriptcn.com 代码示例 # 查询历史记录 query getQueryHistory { QueryHistory { id name time ABC # 请求不存在的字段 } }
服务端代码:
// javascriptcn.com 代码示例 import { graphql, buildSchema } from "graphql"; import express from "express"; // 初始化 GraphQL Schema const schema = buildSchema(` type QueryHistoryType { id: ID! name: String! time: String! } type Query { QueryHistory: QueryHistoryType } `); // 定义 GraphQL Resolver const resolver = { QueryHistory: () => { // 模拟一个不存在的字段 throw new Error("Request field `ABC` not found in `QueryHistoryType`."); return { id: 1, name: "history", time: new Date(), }; }, }; // 定义一个中间件,用于处理 GraphQL Router const graphqlMiddleware = async (req, res) => { // 执行 GraphQL 查询 const { data, errors } = await graphql({ schema, source: req.body.query, rootValue: resolver, variableValues: req.body.variables, }); // 如果存在错误,需要进行错误处理 if (errors) { res.status(404).json({ data: null, message: errors[0].message, status: 404, path: errors[0].path, }); } else { res.json({ data, message: "Success!", status: 200, }); } }; // 初始化 Express 应用程序 const app = express(); // 设置 Express 相关配置 app.use(express.json()); // 添加 GraphQL 中间件 app.post("/graphql", graphqlMiddleware); // 启动 Express 应用程序 app.listen(3000, () => { console.log("GraphQL Server is listening on http://localhost:%d", 3000); });
总结
本文主要介绍了如何优化 GraphQL 错误处理,涉及了统一错误格式、细分错误类型、错误信息重构、异常处理和合理的调试工具等方面。通过对 GraphQL 错误处理相关知识的深入学习和实践,相信能够使我们的 GraphQL API 更加稳定、可靠,从而更好地服务于业务。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654295fa7d4982a6ebc435cc