前言
GraphQL 是一个基于类型和字段的查询语言,它允许我们以一种简洁、强类型和可理解的方式来描述和查询 API 数据。然而,GraphQL 本身不包含错误处理方案,这就需要我们自己来处理错误。一个很好的解决方案是使用 @tipe/graphql-apollo-errors 这个 npm 包。本文将详细介绍如何使用这个包来处理错误。
安装
首先,我们需要在项目中安装 @tipe/graphql-apollo-errors 包。可以使用 npm 或者 yarn 进行安装:
npm install @tipe/graphql-apollo-errors
或
yarn add @tipe/graphql-apollo-errors
使用
错误类型
@tipe/graphql-apollo-errors 支持以下五种错误类型:
- BAD_USER_INPUT
- UNAUTHENTICATED
- FORBIDDEN
- NOT_FOUND
- INTERNAL_SERVER_ERROR
集成
首先,需要引入两个包:
const { createError } = require('@tipe/graphql-apollo-errors'); const { ApolloError } = require('apollo-server');
接下来,使用 createError
函数来创建错误:
const myError = createError('BAD_USER_INPUT', { message: 'This is a test error message', data: { key: 'value', }, });
createError
函数的第一个参数为错误类型,可以是上面列出的五种之一。第二个参数为一个对象,包含错误信息和可选的数据。这里我们自定义了一个 myError
。
接下来,在 GraphQL Resolver 中使用 ApolloError
包裹错误即可:
async function resolver(_, { input }) { try { throw myError; } catch (e) { throw new ApolloError(e.code, e.message, e.data); } }
上面的代码中,我们在 Resolver 中抛出了 myError
,然后用 ApolloError
包裹并抛出。这个错误会被 Apollo Server 捕获,并返回给客户端。
错误处理程序
我们可以定义错误处理程序来捕获错误并进行自定义处理。首先需要定义错误捕获函数:
function handleErrors(err) { if (err.extensions && err.extensions.code === 'BAD_USER_INPUT') { console.error(err); // 处理错误逻辑 } else { console.error(err); } }
这个函数接收一个错误对象,并根据错误类型进行处理。在这里,我们为 BAD_USER_INPUT
添加了特殊处理。其余的错误类型,我们将其打印至控制台。
接下来,在 Apollo Server 配置中使用错误处理程序:
const server = new ApolloServer({ typeDefs, resolvers, formatError: handleErrors, });
可以看到,我们将 handleErrors
函数传给了 formatError
。这个函数会在 Apollo Server 捕获到错误时调用。
完整示例
接下来,我们来看一个使用 @tipe/graphql-apollo-errors 的完整示例。
首先,我们定义了 createUser
mutation:
-- -------------------- ---- ------- ----- - ----------- - - --------------------------------------- ----- - ----------- - - ------------------------- ----- ----- - -------- -------- ----- -------- - ----- -------- --- - ---- -- - -- ---------------------- - ----- ----------------------------- - -------- -------- ------- -------- ----- - ----- -- --- - ---- - ----------------- ------ ----- - -- -------------- - ---------
在这个 mutation 中,我们首先判断名字是否已经被使用,如果被使用则抛出了一个 BAD_USER_INPUT
类型的错误。
接下来我们在 Schema 中定义这个 mutation:
type Mutation { createUser(name: String!): String! }
为了测试这个 mutation,我们来定义一个测试 Query:
type Query { getUsers: [String!]! }
下一步,我们需要定义错误处理程序:
function handleErrors(err) { if (err.extensions && err.extensions.code === 'BAD_USER_INPUT') { console.error(err); // 处理 BAD_USER_INPUT } else { console.error(err); } }
最后,在 Apollo Server 启动时添加这些代码:
-- -------------------- ---- ------- ----- --------- - - ------ ------------------------------ --------- - ----------- ---------------------------------- -- -- ----- ------ - --- -------------- --------- -------------------- ---------- ------------ ------------- ---
现在,当我们尝试创建已有的用户时,就会得到如下错误:
-- -------------------- ---- ------- - --------- - - ---------- ----- ---- ------- -------- ------------ - - ------- -- --------- - - -- ------- --------------- ------------- - ------- ----------------- ------- ----- ------- - ------- -------- - - - -- ------- ---- -
这个错误符合我们的预期,我们成功地使用了 @tipe/graphql-apollo-errors,提升了我们的错误处理体验。
总结
以上是本文介绍的 @tipe/graphql-apollo-errors 包的使用教程。本文从安装、使用和错误处理程序入手,详细介绍了如何使用这个包来处理错误,希望对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60057c2e81e8991b448ebbc0