在 GraphQL 服务器中,错误处理是至关重要的一部分,因为它能确保客户端获得合适的错误信息和状态码。本文将探讨 GraphQL 的错误处理方法,并提供一些指导意义和示例代码。
GraphQL 错误处理基础
当 GraphQL 服务器返回一个错误时,它有两种不同的错误类型:语法错误和运行时错误。
语法错误
语法错误就是在客户端的 GraphQL 查询语句中有错误时,由 GraphQL 服务器抛出的错误。这类错误通常不是开发者的问题,而是由于客户端发送了错误的查询语句造成的。
例如,当客户端发送如下的查询语句时,它将会抛出一个语法错误:
{
user (id: 123
}在这段代码中,缺少了右括号,这将导致服务器无法解析查询语句。客户端应该能够从服务器响应中得到一个具有描述性错误信息的响应,例如:
{
"errors": [
{
"message": "GraphQL syntax error in \"user(id: 123 }\""
}
]
}这里 errors 是服务器响应的关键字,它包含了所有的错误信息。
运行时错误
运行时错误是在 GraphQL 查询语句正确但服务器在执行该查询时抛出的错误。当开发人员泄漏了一个定义错误或者逻辑错误时,这类错误通常会出现。
例如,当客户端发送如下的查询语句时,它将会抛出一个运行时错误:
{
user (id: "10") {
name
age
}
}在这个例子中,我们假设 age 是一个没有定义的字段。服务器会尝试执行查询语句,并在执行过程中发生错误。客户端应该返回一个具有描述性错误信息的响应,例如:
// www.javascriptcn.com code example
{
"errors": [
{
"message": "Cannot query field \"age\" on type \"User\".",
"locations": [
{
"line": 3,
"column": 5
}
]
}
]
}这里 locations 是一个可选的字段,它可以包含有关错误发生位置的有用信息,例如行和列。
关于错误处理的最佳实践
在 GraphQL 服务器中,错误处理是一种良好的实践,它不仅可以帮助开发人员快速定位问题,而且可以提供更好的用户体验。
以下是 GraphQL 服务器中错误处理的最佳实践:
- 返回具有有用信息的错误:错误信息应该具有足够的细节,让客户端了解问题并提供有用的修复建议。
- 使用正确的状态码:当服务器返回错误时,状态码应该是正确的,以便客户端可以处理服务器的响应。
- 使用文档页面来帮助用户:作为最后一道防线,服务器应该提供一个文档页面,以帮助用户理解错误和如何解决问题。
GraphQL 服务器错误处理的示例代码
以下是一个使用 Express.js 框架和 Apollo Server 实现的错误处理示例:
// www.javascriptcn.com code example
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
const typeDefs = gql`
type User {
name: String!
age: Int!
}
type Query {
user(id: ID!): User!
}
`;
const users = [
{ id: '1', name: 'Alice', age: 28 },
{ id: '2', name: 'Bob', age: 32 }
];
const resolvers = {
Query: {
user: (_, { id }) => {
const user = users.find(user => user.id === id);
if (!user) {
throw new Error(`User with ID ${id} not found`);
}
return user;
}
}
};
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: error => {
console.error(error);
return {
message: error.message,
extensions: {
code: error.extensions?.code || 'INTERNAL_SERVER_ERROR',
timestamp: new Date().toISOString()
}
}
},
introspection: true,
playground: true,
});
const app = express();
server.applyMiddleware({ app });
app.use((error, _, res, __) => {
console.error(error);
res.status(error.status || 500)
.json({
message: error.message
});
});
const port = process.env.PORT || 4000;
app.listen(port, () => {
console.log(`🚀 Server ready at http://localhost:${port}${server.graphqlPath}`);
});这段代码定义了一个简单的 GraphQL 服务器,该服务器提供了一个查询 user(id: ID!),并确定给定的用户 ID 是否存在于 users 数组中。如果用户不存在,服务器会抛出一个错误。GraphQL 服务器还定义了 formatError 钩子,以便轻松地构建服务器响应。此外,这个示例代码还包含了一个错误处理中间件,以处理服务器在其他地方抛出的错误。
结语
在 GraphQL 服务器中,错误处理是一项非常重要的任务。正确处理错误消息不仅可以使客户端更快地定位问题,而且可以提供更好的用户体验。在考虑如何处理 GraphQL 中的错误时,请记住最佳实践,并遵循上面的示例代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6457ea941bf7134bf89f1