GraphQL是一种由Facebook开发的查询语言,它可以定义API的类型系统,使前端和后端开发者之间的沟通更加简单。在GraphQL API中,错误处理和验证是非常重要的一部分,因为您需要确保API返回的数据是正确和安全的。在这篇文章中,我们将讨论如何在GraphQL API中添加错误处理和验证,以确保API能够安全和有效地工作。
错误处理
在GraphQL API中,错误可以以多种形式出现。例如,由于提交的查询包含错误的参数,返回类型可能无效,或者您在解析查询时遇到了未知的错误。为了处理这些错误,GraphQL提供了一种称为错误处理的方式。错误处理是一种在GraphQL API中跟踪和处理错误的机制。
1. 错误类型定义
在GraphQL API中定义错误类型是非常重要的,通过这样做,您可以让Web客户端更好地了解API返回的错误信息。定义错误类型的方式可以参考下面的示例代码:
// javascriptcn.com code example type Query { # 查询API getSomeData(id: Int!): Response! } # 定义错误类型 type Error { code: Int! message: String! } # 定义响应类型 type Response { data: [SomeData] error: Error }
在这个例子中,我们定义了一个错误类型,包含错误代码和错误信息。在响应类型中,我们通过将错误类型Error
实例化来表示API的错误。
2. 错误处理代码示例
一旦定义了错误类型,您需要编写一些错误处理代码来实现API的错误处理。查看下面的示例代码,其中包含了一个错误处理的代码示例,当输入的参数包含错误时,输出一个Error
实例。
// javascriptcn.com code example const { GraphQLObjectType, GraphQLSchema, GraphQLString, GraphQLInt, } = require('graphql'); const SomeData = new GraphQLObjectType({ name: 'SomeData', fields: () => ({ id: {type: GraphQLInt}, name: {type: GraphQLString}, }), }); const ErrorType = new GraphQLObjectType({ name: 'Error', fields: () => ({ code: {type: GraphQLInt}, message: {type: GraphQLString}, }), }); // 定义查询类型 const QueryType = new GraphQLObjectType({ name: 'Query', fields: { getSomeData: { type: SomeData, // 处理查询参数和返回对象 args: { id: {type: GraphQLInt}, }, resolve: (root, args) => { if (args.id !== 1) { // 返回错误对象 return { error: { code: 404, message: 'Not Found', } }; } // 返回正常响应 return { id: args.id, name: 'some data name', }; }, }, }, }); // 定义GraphQL Schema const schema = new GraphQLSchema({ query: QueryType, }); exports.schema = schema;
在这个示例代码中,我们在resolve
函数中添加了一个判断逻辑,当参数id
不等于1时,返回一个Error
实例。这个例子只是一种简单的错误处理的方式,更复杂的实现方式需要根据具体的业务逻辑来设计。
验证
除了错误处理之外,GraphQL API还需要验证来确保提交的查询是正确和安全的。GraphQL提供了一种称为验证的机制,它可以验证查询和变量是否符合API的类型定义。
1. 查询和变量的验证
GraphQL API接收的查询和变量是需要验证的,如果提交的查询包含类型错误或者缺少必要的参数,则会返回对应的错误信息。下面是一个示例,展示了如何验证一个提交的查询:
query SomeDataQuery($id: Int!, $name: String) { getSomeData(id: $id) { id name } }
在这个例子中,查询需要传递必要的参数id
和可选的参数name
。当您发送这个查询时,服务端会检查这个查询是否符合API的类型定义,如果API定义需要两个参数(例如,id
和 name
),则服务端会拒绝只包含id
参数的查询,并返回一个错误信息。
2. 验证示例
GraphQL API的验证代码示例,可以参考下面的代码:
// javascriptcn.com code example const { GraphQLObjectType, GraphQLSchema, GraphQLString, GraphQLInt, } = require('graphql'); const SomeData = new GraphQLObjectType({ name: 'SomeData', fields: () => ({ id: {type: GraphQLInt}, name: {type: GraphQLString}, }), }); // 定义查询类型 const QueryType = new GraphQLObjectType({ name: 'Query', fields: { getSomeData: { type: SomeData, // 处理查询参数和返回对象 args: { id: {type: GraphQLInt}, }, validate: async (args, context) => { // 检查参数是否符合类型定义 if (typeof args.id !== 'number') { throw new Error('invalid argument'); } // 验证通过 return; }, resolve: (root, args) => { // 返回正常响应 return { id: args.id, name: 'some data name', }; }, }, }, }); // 定义GraphQL Schema const schema = new GraphQLSchema({ query: QueryType, }); exports.schema = schema;
在这个代码中,我们定义了一个validate
函数来验证传入的查询是否符合类型定义。当validate
函数抛出一个错误时,会返回一个错误信息。在这个示例中,我们检查了查询的参数是否为数字类型,如果不是则返回一个错误信息。
结论
在GraphQL API开发过程中,错误处理和验证是非常重要的一部分。通过定义错误类型、验证查询和变量,可以使GraphQL API的开发更加安全和可靠。在实际开发中,您需要根据具体业务逻辑来设计实现细节,以确保API能够安全有效地工作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67347bb60bc820c5824962b4