GraphQL 是一种用于 API 开发的查询语言和运行时执行程序。它可用于构建更灵活、有效和强大的 API。然而,当我们使用 GraphQL 时,我们难免会遇到一些错误,如查询错误、处理错误和语法错误等。在这篇文章中,我们将深入了解 GraphQL 中的错误处理机制。
错误处理的基础
在 GraphQL 中,错误处理主要由两部分组成:错误类型和错误处理程序。
错误类型
前面提到的错误类型有三种:查询错误、处理错误和语法错误。
查询错误:这种错误通常在查询过程中发生,例如查询无效的字段或使用了无效的类型。
处理错误:这种错误通常是由程序逻辑错误引起,例如程序意外中断或尝试访问未定义的变量。
语法错误:这种错误通常是由查询语句中的拼写错误、语法错误等引起的。
因此,我们在处理错误时要根据不同类型的错误进行不同的处理。
错误处理程序
在 GraphQL 中,我们可以使用 GraphQL 中间件来为我们的 API 组件提供错误处理功能。我们可以创建一个错误处理程序来处理不同类型的错误,并根据错误的严重程度采取不同的措施。常用的错误处理程序有:
错误日志记录程序:当错误发生时,将错误信息记录到错误日志中。
错误信息反馈程序:当错误发生时,向客户端返回错误信息。
错误恢复程序:当错误发生时,尝试恢复系统,以避免进一步的错误。
但是,需要注意的是,我们要根据错误的类型和严重程度选择不同的错误处理程序,否则可能会对系统造成更严重的影响。
GraphQL 中的错误处理机制
现在让我们来深入了解 GraphQL 中的错误处理机制。
错误类型
在 GraphQL 中,我们可以通过 GraphQLError
类型来处理错误,它包含了一个错误信息数组。
const { GraphQLError } = require('graphql'); const error = new GraphQLError('Error Message'); console.log(error.message); // Error Message
在 GraphQL 查询中,可以通过抛出上述错误来报告消息。例如:
if (someError) { throw new GraphQLError('Invalid Username') }
我们也可以使用 GraphQLList
封装类型来处理错误。
// javascriptcn.com 代码示例 import { GraphQLList, GraphQLString } from 'graphql'; const someType = new GraphQLList(GraphQLString); const resolve = (_, __, context) => { if (context.error) throw new GraphQLError('Error Message'); return ['String 1', 'String 2']; }; export { someType, resolve };
错误处理程序
在 GraphQL 中,我们可以使用错误处理函数来处理错误。GraphQL 中间件执行查询时,如果遇到错误,将自动调用注册的错误处理程序来处理错误。
但是,需要注意的是,GraphQL 中间件只会调用一个错误处理程序。也就是说,如果多个错误处理程序都注册了同样的错误类型,那么只有第一个遇到的错误处理程序会被调用。
让我们来看一个例子。我们将使用 Apollo Server 来处理 GraphQL 查询和错误。首先,我们需要创建一个 GraphQL 查询架构:
// javascriptcn.com 代码示例 import { ApolloServer, gql } from 'apollo-server'; const typeDefs = gql` type Query { hello: String errorTest: String } `; const resolvers = { Query: { hello: () => 'Hello World', errorTest: () => { throw new Error('Test Error'); }, }, }; const server = new ApolloServer({ typeDefs, resolvers, }); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
现在,如果我们在浏览器中向服务器发送一个错误查询请求:
query { errorTest }
服务器将返回以下结果:
// javascriptcn.com 代码示例 { "errors": [ { "message": "Test Error", "locations": [ { "line": 3, "column": 3 } ], "path": [ "errorTest" ] } ], "data": { "errorTest": null } }
我们可以看到,服务器返回了一个错误信息和 null 值的结果。
如果我们需要自定义错误处理程序,我们可以在 ApolloServer
构造器中添加 formatError
选项来修改返回的错误信息。例如:
// javascriptcn.com 代码示例 const server = new ApolloServer({ typeDefs, resolvers, formatError: (error) => { return { message: error.message, code: 'ERROR', }; }, });
现在,如果我们再次发送错误查询请求,服务器将返回以下结果:
// javascriptcn.com 代码示例 { "errors": [ { "message": "Test Error", "code": "ERROR" } ], "data": { "errorTest": null } }
我们可以看到,服务器返回了一个自定义的错误信息,包括错误消息和错误代码。
总结
GraphQL 的错误处理机制是一个非常重要的特性,它可以有效地处理各种错误,包括查询错误、处理错误和语法错误。在使用 GraphQL 中间件时,我们应该根据错误的类型和严重程度选择不同的错误处理程序来避免不必要的麻烦。在实践中,我们常用的错误处理程序有错误日志记录程序、错误信息反馈程序和错误恢复程序。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652a4c327d4982a6ebc9dfa4