如何解析 GraphQL 返回的错误信息

如何解析 GraphQL 返回的错误信息

在开发前端应用时,与后端的数据交互通常都采用 REST API 接口,而最近几年出现的 GraphQL 也逐渐流行起来,成为了前端应用和后端数据交互的新选择。然而,由于 GraphQL 查询和变更语句都是字符串形式的,当发生错误时,系统并不会像 REST API 一样返回简单的 HTTP 错误码和错误信息,而是需要针对每个 GraphQL 请求单独解析返回的错误信息。因此,本文将介绍如何解析 GraphQL 返回的错误信息,帮助前端开发者更好地利用 GraphQL。

  1. GraphQL 错误信息格式

当进行 GraphQL 远程操作时(查询或变更等),GraphQL 服务端将返回一个 JSON 对象,其中包含查询结果、错误信息等等。但是,如果请求出现错误,服务端返回的结果中将有一个 errors 字段,它将包含一个错误信息数组。每个错误信息对象都会包含至少一个 message 字段,用于描述错误信息。下面是一个含有错误信息的 GraphQL 返回结果示例:

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

其中:

  • data 表示成功返回的数据;
  • errors 表示全部的错误信息数组,如果没有错误,该字段将不存在;
  • message 表示具体的错误信息,该字段是必需的;
  • locations 表示错误发生的位置,包含行、列信息;
  • path 表示查询中报错的对象路径。

在实际解析错误信息时,错误信息数组 errors 可能含有多个对象,每个对象的 message 字段描述了不同的错误。

  1. 解析 GraphQL 错误信息

对于前端开发者而言,最需要的是将 GraphQL 返回的错误信息解析为一个相对友好且可处理的格式,以便在用户面前显示或进一步处理。下面使用示例代码演示如何解析 GraphQL 返回的错误信息。

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

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

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

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

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

上述代码中,我们通过解构错误参数对象中的 graphQLErrors 字段获取错误信息数组,并使用 forEach() 方法遍历所有错误。对于每个错误,我们使用 console.log() 打印出其 message、extensions、path、locations 等相关信息,以便开发者了解错误的具体情况并进一步调试。

使用示例:

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

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

在上述示例中,我们使用了 Apollo 客户端库的 graphql() 函数查询用户信息,这个函数返回一个 promise,then() 方法中获取成功返回的 data,catch() 方法中捕捉可能出现的错误,进而调用 handleGraphQLError() 函数解析 GraphQL 错误信息。

  1. 深入学习 GraphQL 错误处理

了解了如何解析 GraphQL 返回的错误信息,我们可以进一步深入学习 GraphQL 错误处理的相关知识,优化我们的代码。

  • GraphQL 错误分类

GraphQL 可能会抛出两种类型的错误:

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

开发者可以根据这两类错误处理机制进行具体的代码编写。

  • 端到端错误链路跟踪

GraphQL 在服务端到客户端之间建立了一个完整的数据路径,而这个路径上的每个环节都可能发生错误。因此,在解析 GraphQL 错误信息时,我们还需要跟踪整个错误链路(Error Link)并划分错误级别,以便在系统中进行更好的错误处理和研发优化。

  • 添加更多错误信息

除了 message、extensions、path、locations 等固定的错误信息,GraphQL 还支持开发者自定义错误信息,并在错误信息中返回相关数据。这样可以比较方便地在客户端进行错误处理、状态更新等操作。

  1. 总结

本文介绍了如何解析 GraphQL 返回的错误信息。在前端应用中应用 GraphQL 时,掌握如何解析 GraphQL 返回的错误信息是非常重要的,并且需要将其作为代码的一部分进行规范化处理。本文提供了示例代码和相关实践经验,帮助开发者更好地掌握 GraphQL,并进一步优化应用程序。

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


猜你喜欢

  • 创建可复用的 RxJS 操作符

    RxJS 是一款非常强大的 JavaScript 库,它提供了一套丰富的操作符,使得数据处理变得更加易于操作。但是,如果你需要使用特定的操作符来处理数据,每次都需要写重复的代码就显得非常笨重。

    1 年前
  • 解决 Tailwind CSS 在 Laravel 中报错的问题

    背景 Tailwind CSS 是一个流行的 CSS 框架,其需要与 Laravel 类的后端框架配合使用。然而,在 Laravel 中使用 Tailwind CSS 时,有时会出现以下错误: ---...

    1 年前
  • SASS 中如何使用!important

    在 CSS 中,有些属性是可以被覆盖的,而有些则是不可以被覆盖的。!important 是一种能够为 CSS 属性标记优先级的机制,通过在属性值后添加 !important 标志后,可以让属性值具有最...

    1 年前
  • Serverless Framework 部署实践技巧总结

    随着云计算和微服务的快速发展,Serverless 技术逐渐成为前端开发中不可或缺的一环。而 Serverless Framework,作为 Node.js 开发者使用最多的 Serverless 框...

    1 年前
  • 如何在 Jest 中模拟 axios :正确姿势

    如果您经常使用 Axios 发起 HTTP 请求,那么您的测试用例可能需要一种方式来模拟 Axios 。 Jest 是一个流行的测试框架,它提供了多种选项来测试 Axios 模块。

    1 年前
  • React Native for Android 如何真机调试

    React Native 常用于创建在 iOS 和 Android 上本地运行的移动应用程序,其支持开发者通过 JavaScript 和 React 的知识进行跨平台开发,最终编译成本地应用程序,其提...

    1 年前
  • 使用 Docker 构建 Node.js 微服务应用

    Docker 简介 Docker 是一个开源项目,它提供了一个轻量级的容器化环境来运行应用程序。Docker 的优点在于不需要对主机进行任何改动,即可在容器中运行应用程序。

    1 年前
  • ES9 中的 Array.prototype.includes() 方法

    在 ES9 中,JavaScript 新增了 Array.prototype.includes() 方法,该方法可以判断一个数组是否包含某个值,返回值为布尔类型。 语法 ---------------...

    1 年前
  • 使用 Headless CMS 和 Gatsby 构建模板的群众信仰

    随着 Web 技术的不断发展,大量的网站都需要极客精神和大量的代码开发,但是这个过程也存在很多问题,如维护难度、安全、扩展性差等等,这时候,Headless CMS 和 Gatsby 就能够帮我们解决...

    1 年前
  • ES2020 之动态导出和 import.meta.url 的解析

    随着 JavaScript 的不断发展,越来越多的语言特性被加入到了 ECMAScript 中。ES2020 是 ECMAScript 的最新标准版本,它带来了许多有用的特性,其中就包括动态导出和 i...

    1 年前
  • ES2021 中的 Dynamic import,动态导入实战

    ES2021 中的 Dynamic import 功能让 JavaScript 应用程序能够动态地从外部模块中导入模块。与常规的 import 语句不同的是,Dynamic import 允许在程序运...

    1 年前
  • 如何使用 Express.js 实现 GraphQL 计算字段

    GraphQL 是一种用于 API 的查询语言和运行时环境,它能够帮助我们实现多个数据源的整合、可组合的 API 查询和完善的 API 消费体验。Express.js 是一个快速、灵活、开放源代码的 ...

    1 年前
  • PM2 进程管理实践:如何使用 PM2 在生产环境中实现自动扩容和缩容

    在开发和部署前端应用的过程中,我们经常需要管理多个进程,以确保应用的稳定性和可伸缩性。PM2 是一个流行的进程管理工具,它能够极大地简化进程管理的复杂度,提高开发效率。

    1 年前
  • ES8 中的函数赋值语法总结

    ES8(也称为 ECMAScript 2017)是 ECMAScript 的第八个版本,它在函数赋值语法方面引入了一些新特性,使得编写函数的过程更加方便和简单。本文将针对这些新特性进行总结和介绍。

    1 年前
  • Kubernetes 中如何使用 PV 和 PVC 进行数据持久化

    在 Kubernetes 中,Pod 的生命周期是短暂的,当它被删除时,所保存的数据也会随之消失,这不适用于需要长期保存数据的应用程序。这时,我们需要使用 PV(Persistent Volume)和...

    1 年前
  • 使用 Babel-plugin-universal-import 实现 Webpack code-splitting

    使用 Babel-plugin-universal-import 实现 Webpack code-splitting 随着 Web 应用越来越复杂,我们开始需要更多的 JavaScript 代码来支持...

    1 年前
  • 如何在 Electron 应用程序中使用 LESS?

    在前端开发中,我们通常会使用 LESS 来进行 CSS 的预处理。使用 LESS 可以方便地定义变量、函数和 mixin,增强了代码的可维护性和可复用性。在 Electron 应用程序中也可以使用 L...

    1 年前
  • 早上一个简单的 ESLint 报错,困扰我一个半小时!

    今天早上在进行前端开发时,我的代码编辑器突然跳出了一个 ESLint 的报错,提示我代码中存在语法错误,然而我并没有找到任何错误,这个问题困扰了我一个半小时,最后终于找到了问题的根源。

    1 年前
  • Vue 中 JSX 语法的使用技巧

    随着前端技术的不断发展,越来越多的开发者开始使用 Vue 来构建自己的 Web 应用程序。Vue 框架提供了许多工具和功能,其中 JSX 语法是一种非常强大和灵活的技术。

    1 年前
  • Angular 5 中使用 SPA 技术实现后台管理页应用详解

    前言 随着 Web 技术的不断发展,单页应用 (Single Page Application,SPA) 技术逐渐被广泛使用。其通过通过JavaScript 动态渲染页面,从而实现无需刷新页面,提升用...

    1 年前

相关推荐

    暂无文章