在上一篇中,我们讨论了常见的错误类型以及它们在 GraphQL API 中可能引发的问题。这一篇将补充如何在 GraphQL API 中有效地处理这些错误和异常,以确保我们的应用能够优雅地处理问题,提供良好的用户体验。
理解异常处理机制
在构建 GraphQL API 时,错误处理至关重要。通过捕获和处理错误,我们可以避免将系统错误暴露给用户,同时可以为开发者提供有用的信息。
基本原则
- 捕获异常:使用 try-catch 块来捕获可能抛出的异常。
- 返回统一格式的错误响应:确保 API 返回的错误信息遵循统一的格式,方便前端处理。
- 记录错误:在适当的地方记录错误日志,以便后续排查。
案例:处理异常并返回标准化错误格式
假设我们有一个简单的 GraphQL 查询,用于获取用户信息。在这个过程中,我们需要处理潜在的异常。
GraphQL Schema
1 2 3 4 5 6 7 8 9
| type User { id: ID! name: String! email: String! }
type Query { user(id: ID!): User }
|
解析器实现
在解析器中,我们将使用 try-catch
块来捕获异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const resolvers = { Query: { user: async (_, { id }) => { try { const user = await getUserById(id); if (!user) { throw new Error(`User with ID ${id} not found.`); } return user; } catch (error) { throw new Error(`An error occurred: ${error.message}`); } }, }, };
async function getUserById(id) { if (id === "1") { return { id: "1", name: "Alice", email: "alice@example.com" }; } return null; }
|
错误处理的响应格式
在 GraphQL API 中,标准的错误响应格式通常是一个包含错误信息的数组。我们可以根据需要定制错误信息的返回格式。
下面是一个修改后的错误处理示例,在获取用户信息时,返回一个结构化的错误响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| const resolvers = { Query: { user: async (_, { id }) => { try { const user = await getUserById(id); if (!user) { throw new UserNotFoundError(id); } return user; } catch (error) { logError(error); throw formatGraphQLError(error); } }, }, };
class UserNotFoundError extends Error { constructor(id) { super(`User with ID ${id} not found.`); this.name = "UserNotFoundError"; } }
function formatGraphQLError(error) { return { message: error.message, code: error.name === "UserNotFoundError" ? "USER_NOT_FOUND" : "INTERNAL_SERVER_ERROR", }; }
function logError(error) { console.error(`[Error]: ${error.message}`); }
|
GraphQL 错误的标准化响应
通过上述的实现,当用户请求一个不存在的用户时,返回的错误信息将会格式化为如下结构:
1 2 3 4 5 6 7 8 9
| { "errors": [ { "message": "User with ID 2 not found.", "code": "USER_NOT_FOUND" } ], "data": null }
|
小结
在本篇中,我们了解了如何在 GraphQL API 中处理错误与异常,确保错误被优雅地捕获并以结构化的格式返回。接下来,我们将在下一篇中深入探讨如何定制错误消息,以更好地满足不同场景下的需求。
希望通过一系列的错误处理机制,您能够加强对 GraphQL API 的开发质量控制,使得您的应用更加健壮,用户体验更佳。