GraphQL 中如何利用错误处理器来处理异常?

GraphQL 是一种用于构建 API 的查询语言,它可以让客户端按需获取数据,从而避免传统 REST API 中的过度获取数据的问题。然而,由于 GraphQL 的语法和设计方式与传统的 REST API 不同,因此在处理请求时,需要进行错误处理,并在出现异常或错误时返回适当的错误信息,以便客户端进行处理。

本文将重点介绍 GraphQL 中如何利用错误处理器(error handler)来处理异常,以及如何使用其中的异常处理逻辑。

错误处理器的使用

GraphQL 提供了 GraphQLServer 对象和 express-graphql 中间件来处理 GraphQL 请求,它们都有一个 formatError 函数,用于处理错误信息。

GraphQLServer 对象

在使用 GraphQLServer 对象时,可以通过 formatError 函数来自定义错误信息的格式和内容。

----- ------- - -------------------
----- - ------------- - - ------------------------

----- -------- - -
  ---- ----- -
    ----------- -------- -------
  -
--

----- --------- - -
  ------ -
    ------ --- - ---- -- -- -
      -- ------- -
        ----- --- ----------- --------- -- -----------
      -
      ------ ------ ----------
    --
  --
--

----- ------ - --- ---------------
  ---------
  ----------
  ------------ ----- -- -
    ------ -
      -------- ------------
      ----- ----
    --
  --
---

--------------- -- -
  ------------------- ------- -- ------------------------
---

在上面的例子中,我们自定义了一个错误处理器,它会返回一个包含自定义错误信息和自定义错误码的对象。

express-graphql 中间件

在使用 express-graphql 中间件时,可以通过 formatError 选项来自定义错误信息的格式和内容。

----- ------- - -------------------
----- - ----------- - - ---------------------------
----- - ----------- - - -------------------

----- ------ - -------------
  ---- ----- -
    ----------- -------- -------
  -
---

----- --------- - -
  ------ -- ---- -- -- -
    -- ------- -
      ----- --- ----------- --------- -- -----------
    -
    ------ ------ ----------
  --
--

----- --- - ----------

--------
  -----------
  -------------
    -------
    ----------
    --------- -----
    ------------ ----- -- -
      ------ -
        -------- ------------
        ----- ----
      --
    --
  --
--

---------------- -- -- -
  ------------------- ------- -- --------------------------------
---

在上面的例子中,我们自定义了一个错误处理器,它也会返回一个包含自定义错误信息和自定义错误码的对象。

使用 GraphQL 中的错误处理器

在实际使用中,我们可以根据不同的错误情况使用不同的处理逻辑。

处理持久化错误

在应用程序中,当我们需要向数据库或外部 API 发送请求时,往往需要处理持久化错误。可以通过自定义错误处理器来处理此类错误。

------------ ----- -- -
  -- ------------------ ---------- -------------------------- -
    ------ -
      -------- -------------------------------- -- ------------------ ---
      ----- ----
    --
  - ---- -- ------------------ ---------- -------------------------------- -
    ------ -
      -------- -------------------------------- -- ------------------ ---
      ----- ----
    --
  - ---- -
    ------ -
      -------- ------------
      ----- ----
    --
  -
--

在上例中,我们使用 Sequelize 来访问数据库,如果捕获到持久化错误,则可以根据不同的错误类型返回不同的错误信息。

处理授权错误

GraphQL 默认使用 GraphQLNonNullGraphQLObjectType 的实例来定义字段类型时,会自动添加非空验证逻辑,如果请求的字段值为空,则会抛出 ValidationError 异常。可以通过自定义错误处理器来处理授权错误。

------------ ----- -- -
  -- ------------------ ---------- ---------------- -
    ------ -
      -------- ---- ------------
      ----- ----
    --
  - ---- -
    ------ -
      -------- ------------
      ----- ----
    --
  -
--

在上例中,我们使用自定义验证器来拒绝未经授权的请求,并返回相应的错误信息。

结论

错误处理器是 GraphQL 中一项非常重要的功能,它可以让我们有效地处理异常和错误,使客户端能够更加准确地处理 GraphQL 请求。我们应该充分利用这一功能来创建更加健壮的 GraphQL API。

完整代码参考:

https://github.com/futantan/graphq-error-handling-example

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6710cf83ad1e889fe2fc2a91


猜你喜欢

  • Mocha 测试框架:如何利用环境变量传递参数

    Mocha 是一款流行的 JavaScript 测试框架,它支持 BDD 和 TDD 测试风格,并可用于前端和后端 JavaScript 应用程序的测试。本篇文章将介绍如何在 Mocha 测试中利用环...

    6 天前
  • 如何使用 SSE 实现在客户端动态生成 HTML

    在现代 Web 应用程序中,动态更新数据变得愈发重要。Server Sent Events(SSE)是一项 Web 技术,通过它浏览器可以接收来自服务器的推送事件,以便向用户推送最新的数据。

    6 天前
  • Hapi.js 中如何实现自定义 Hapi 插件

    Hapi.js 中如何实现自定义 Hapi 插件 Hapi.js 是一个流行的 Node.js Web 应用程序框架,由 Walmart Labs 团队开发。它旨在提供一种简单、强大和可扩展的方法来构...

    6 天前
  • 使用 TypeScript 改善 React 应用性能

    在 React 应用中,使用 TypeScript 可以显著提高应用的性能、可维护性和可扩展性。TypeScript 是一种由 Microsoft 开发的静态类型语言,可以在编译时检查代码中的类型错误...

    6 天前
  • RxJS 的操作符 merge、concat、zip、combineLatest 的区别比较

    RxJS是一个非常流行的响应式编程库,用于处理异步数据流。在RxJS中有许多操作符可以用来处理数据流。在这里,我们将重点讨论merge,concat,zip和combineLatest这4个操作符的区...

    6 天前
  • 实战 Fastify 的高并发处理与压力测验

    Fastify 是一款基于 Node.js 的快速 Web 框架,它被设计成非常高效和低开销的,同时支持异步、模块化路由、中间件等一系列现代化的 Web 开发特性。

    6 天前
  • ES10 中的模板字面量标签功能详解

    随着前端技术的快速发展,JavaScript 语言也在不断提供新特性和功能以满足不同的需求。ES10 中一个重要的特性就是模板字面量标签功能(Tagged Template Literals)。

    6 天前
  • Kubernetes-replication-controller 控制器解说

    在 Kubernetes 中,控制器是一个核心的概念,它用于确保正在运行的 Pod 的数量总是与用户定义的数量匹配。其中,Kubernetes-replication-controller 控制器就是...

    6 天前
  • 如何在 Next.js 中使用静态资源文件

    Next.js 是一个在 React 上构建服务端渲染的框架,它可以帮助我们快速的构建高性能的 web 应用程序。在开发过程中,我们常常需要使用图片、音频和视频等静态资源文件,本文将详细介绍如何在 N...

    6 天前
  • 如何使用 Mockaroo 和 Express.js 测试 Node.js 应用程序

    在前端开发中,测试是至关重要的一项工作,因为它可以确保代码的正确性,帮助开发者尽早发现并解决错误,节省开发时间和成本。Mockaroo 和 Express.js 是两个在 Node.js 开发中非常流...

    6 天前
  • 基于 Mocha 的 JavaScript 单元测试:测试异步代码的技巧

    Mocha 是一个流行的测试框架,用于编写 JavaScript 单元测试。在编写单元测试时,测试异步代码通常是至关重要的。在这篇文章中,我们将介绍如何使用 Mocha 来测试异步代码,包括如何使用回...

    6 天前
  • 在 Cypress 中如何处理跨域请求?

    在 Cypress 中如何处理跨域请求? Cypress 是一个流行的前端测试框架,它使用 JavaScript 和 Node.js 编写,并且被广泛使用于单元测试、集成测试以及端到端测试等场景。

    6 天前
  • ES8 中的公共对象隔离示例:Realm

    在前端开发中,对象隔离是一个非常重要的概念,特别是在大型项目中。ES8 中引入了一个新特性:Realm,可用于在 JavaScript 中实现公共对象隔离。 在本文中,我们将介绍 ES8 中 Real...

    6 天前
  • Android Material Design 中实现表格布局 (Grid Layout)

    随着移动设备的广泛应用,更加注重用户体验的 Material Design 成为了许多开发者的首选。其中,表格布局十分常见且实用,可用于将各个组件按照一定的规则排列,并随用户设备的屏幕大小而自适应。

    6 天前
  • Fastify 框架中在不同场景下的异步问题解决方案

    Fastify 是一个高效、低开销的 Node.js Web 框架,它专注于提供最佳的性能和开发体验。在使用 Fastify 框架时,你可能会遇到异步问题,本文将介绍在不同场景下的异步问题解决方案。

    6 天前
  • 使用 Web Components 实现跨平台开发

    什么是 Web Components Web Components 是一种在 Web 开发中实现组件化的技术。它将结构、样式和行为封装在一个自定义元素中,让使用者可以轻松地重复使用和自定义这些组件。

    6 天前
  • 在 Vue.js 项目中使用 Tailwind 的实践:简单易懂的配置指南

    作为一个流行的 UI 库,Tailwind 提供了一系列样式工具集,可以帮助前端开发者快速建立美观而且可重用的界面组件。如果你正在使用 Vue.js,同时想要在你的项目中使用 Tailwind,本文将...

    6 天前
  • 编写更好的单元测试:使用 Enzyme 测试 Redux 应用

    单元测试是每个前端应用程序开发人员的必备技能。它可以帮助捕捉到潜在的问题、提供可靠的反馈以及加快迭代速度。当涉及到 Redux 应用程序时,使用 Enzyme 作为测试工具可以更好地管理测试,更好地组...

    6 天前
  • LESS 与 Bootstrap 框架的结合使用技巧

    Bootstrap 是一种流行的前端框架,它能够帮助开发者快速构建响应式的网站和应用程序。而 LESS 是一种 CSS 预处理器,它可以使开发者更加高效地编写 CSS。

    6 天前
  • Headless CMS 的未来发展趋势:如何解决多个终端设备的适配问题?

    随着各类终端设备的日益增多和多样化,如何解决多个终端设备的适配问题已成为前端开发中的一个重要难题。Headless CMS (无头 CMS)是一种新兴的解决方案,它可以帮助前端开发人员更好地应对这一问...

    6 天前

相关推荐

    暂无文章