GraphQL 是一种查询语言和运行时环境,可以使应用的数据获取更加灵活和高效。尽管在使用 GraphQL 进行查询和数据操作时可以减少很多错误发生的可能,但仍然有些情况下会出现错误,包括网络请求错误、GraphQL 服务器内部错误以及应用逻辑错误等。
在任何情况下,一维护良好的 GraphQL 服务器必须具备优秀的错误处理和日志记录机制。本篇文章将介绍 GraphQL 错误处理和日志记录的最佳实践,帮助读者写出更加健壮、可维护的 GraphQL 服务器。
理解 GraphQL 的错误类型
首先,需要理解 GraphQL 可能出现的错误类型。GraphQL 查询中可能出现以下四种错误:
- 语法错误:查询语句格式错误。
- 验证错误:查询验证器返回的错误信息,如执行变量验证失败、查询和服务器不匹配等。
- 执行错误:查询在服务器上执行时发生的错误,可能是用户定义的错误,也可能是服务器内部错误。
- 未知错误:未知的错误类型。
需要根据错误类型,为 GraphQL 服务器编写不同类型的错误处理程序。
处理 GraphQL 的错误
在编写 GraphQL 服务器时,需要使用 GraphQL 的错误处理程序,以便在错误发生时返回可读的错误信息。下面是一些示例代码:
// www.javascriptcn.com code example
import { ApolloServer, gql } from 'apollo-server';
const typeDefs = gql`
type Query {
hello: String
info: String
}
`;
const resolvers = {
Query: {
hello: () => {
throw new Error('Something went wrong!');
},
info: () => 'Information about the server',
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: (error) => {
// 服务器错误
if (error.extensions.exception) {
console.log(error.extensions.exception.stacktrace);
return {
message: 'Server error',
locations: error.locations,
path: error.path,
};
} else {
return {
// 业务逻辑错误
message: error.message,
locations: error.locations,
path: error.path,
};
}
},
});格式化错误消息是一个优秀的 GraphQL 错误处理程序。在上面的代码中,formatError 函数将解析错误并根据错误的来源返回特定的信息。
这个函数根据 error.extensions.exception 是否包含错误信息,判断出错误是由服务器内部错误还是应用逻辑错误引起的。如果是服务器内部错误,则在控制台打印错误堆栈跟踪信息;否则,只返回错误消息,客户端应用程序可以使用这些信息进行错误提示。
记录 GraphQL 的日志
记录日志是一个重要的任务。它可以方便调试,了解应用的运行状况,从而提高应用程序维护效率和使用体验。
在 GraphQL 服务器中,Harmony 定义了 GraphQL 标准跟踪扩展,可以用来记录 GraphQL 查询的执行时间。这个扩展可以通过 context 配置项将其添加到连接中:
const server = new ApolloServer({
schema,
context: () => ({ requestId: uuidv4() }),
plugins: [ApolloServerPluginLandingPageGraphQLPlayground(), ApolloServerPluginInlineTrace()],
});在上面的代码中,配置了 ApolloServerPluginInlineTrace 插件,该插件会在返回的结果中加入查询的性能信息。
此外,GraphQL 实现还允许自定义访问日志记录器。以下示例说明了如何将请求的 GraphQL 查询记录到控制台:
// www.javascriptcn.com code example
const server = new ApolloServer({
schema,
context: () => ({ requestId: uuidv4() }),
plugins: [
ApolloServerPluginLandingPageGraphQLPlayground(),
ApolloServerPluginInlineTrace(),
{
requestDidStart() {
return {
didResolveOperation({ request, document }) {
console.log(`[${request.context.requestId}] executed query: ${request.operationName}`);
},
};
},
},
],
});在上面的代码中,requestDidStart 函数返回一个拦截器对象,该拦截器对象将 didResolveOperation 生命周期钩子设置为用于记录查询执行信息。
小结
GraphQL 是一种优秀的数据查询语言和运行时环境,可以使应用的数据获取更加灵活和高效。在使用 GraphQL 编写服务器时,我们需要为查询结果处理错误和记录日志,这是开发高质量 GraphQL 应用程序的重要部分。
本篇文章介绍了 GraphQL 处理错误和记录日志的最佳实践,希望能够帮助读者开发出更加健壮、可维护的 GraphQL 应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d63ca6a941bf7134beed1f