GraphQL 中手动进行 type 覆盖的方法

GraphQL 是一个用于 API 的查询语言以及一种由 Facebook 开发的服务端运行库。它允许客户端在 API 中描述所需数据的形状,并从服务端获取到精确的数据。在 GraphQL 中,通过定义 schema 和 resolver 来定义所有可查询数据。然而有时候我们需要手动进行 type 覆盖。

GraphQL schema 和类型系统

GraphQL 中的 schema 定义了 API 中的所有可用字段以及它们之间的关系。这包括查询和变更。而类型系统则定义了所有请求和响应中编码的数据类型。

GraphQL 请求中的类型系统由 query、mutation 和 subscription 等模块来定义。每个模块都由一个或多个字段组成。而传入的参数和返回的数据都有特定的类型。

例如,下面的代码定义了一个简单的 schema,它提供了一个查询类型,以返回 Greetings 字符串。

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

类型覆盖

在 GraphQL 中,类型系统通过 code-first 和 schema-first 两种方法定义。在 code-first 中,基本类型、自定义类型和输入类型等都是由代码自动生成的。在 schema-first 中,类型系统是由开发者定义的,并通过代码生成器生成相应的代码。

在某些情况下,我们需要手动进行类型覆盖。这种情况通常发生在类型系统被动态更改或在复杂的嵌套查询中。

基本数据类型的覆盖

在一个查询或变异中,如果你希望更改基本的 GraphQL 数据类型,如 Int、String 或 Boolean,那么可以通过手动覆盖这些基本类型来实现。

以下面的代码为例,它定义了一个返回整数的查询,

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

现在,我们想返回一个随机的浮点数,我们需要定义一个新的类型覆盖 Int 类型,如下所示:

------ -----

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

这里,我们定义了一个新类型 Float,该类型与 Int 类型具有相同的返回值特征,并将 Query 类型中的 randomNumber 字段的类型更改为 Float。

嵌套类型的覆盖

在一个复杂的嵌套查询中,有时候我们希望重写某个字段的类型。假设我们有一个名为 Post 的类型,该类型具有包含其他类型的字段。我们可以通过重写嵌套类型来更改字段类型。

以下面的代码为例,

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

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

现在,我们想将 author 字段改为仅包含 id 和 name 属性,而忽略 Post 类型。我们可以在 Author 类型中定义新字段,然后覆盖 posts 类型,如下所示:

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

这里,我们定义了一个新类型 postIds,该类型只包含 id 属性。在 posts 字段上,我们使用 @deprecated 和 @skip 指令来防止查询器使用它。这意味着开发者需要在查询中使用新的 postIds 字段,而不是之前的 posts 字段。

总结

GraphQL 中的类型系统和 schema 定义了 API 中的可用字段和所有请求和响应中编码的数据类型。有时候我们需要手动覆盖某些类型以更改 API 返回的数据。对于基本数据类型,我们可以通过重写想要改变的类型来达到目的。对于嵌套类型,我们需要定义新字段并覆盖想要更改的类型。

手动覆盖 GraphQL 的类型可能存在风险,因此在进行类型处理之前,请确保您已经了解了所有相关的安全问题。

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


猜你喜欢

  • Webpack 模块热替换 (HMR) 原理

    Webpack 是前端开发中非常常用的构建工具,它能够将多个文件打包成一个或多个文件,让前端项目打包输出更加高效并且易于维护。而在开发过程中,由于浏览器中的页面和 JavaScript 是单向的,每一...

    1 年前
  • 掌握 ES10 新增的 BigInt 数据类型

    在 JavaScript 语言中,整数类型数据的范围受到了限制,通常只能表示介于 -2^53 和 2^53 之间的整数,导致在数值运算较大时,只能使用工具包或者自己实现大数运算。

    1 年前
  • 在 Angular 应用中使用 FontAwesome 的方法

    FontAwesome 是一款非常流行的图标字体库,它提供了大量的图标供我们使用。在 Angular 应用中使用 FontAwesome 可以方便地引入图标并进行管理,同时也可以减少网络请求和提高页面...

    1 年前
  • 使用 Promise.allSettled 捕获所有 Promise 结果

    Promise 是 JavaScript 中处理异步编程的一种方式,它可以很好地解决回调地狱的问题。不过,在使用 Promise 的过程中,我们经常会遇到一些问题,比如如何处理多个 Promise 同...

    1 年前
  • PWA 技术解析:如何使用 IndexedDB 存储离线数据?

    什么是 PWA? PWA(Progressive Web App)是一种新型的 Web 应用程序模型,它不仅具备传统 Web 应用的优点,例如可访问性、可搜索性以及与其他 Web 应用的链接性等,同时...

    1 年前
  • 利用 Tailwind CSS 优化移动应用的开发过程

    现在,越来越多的人使用手机进行在线购物、查看新闻、浏览社交媒体等各种活动。面对这样的趋势,开发者也需要着手为移动应用优化,让用户能够更好地使用移动设备来体验应用程序。

    1 年前
  • 如何使用 Headless CMS 和微服务架构构建大规模 Web 应用程序

    在当今互联网时代,Web 应用程序的规模和复杂度越来越高,很多应用都需要支持大规模的用户和交易量。为了应对这种趋势,现代 Web 应用程序普遍采用了 Headless CMS 和微服务架构。

    1 年前
  • 在 Mocha 中使用 jsdom 模拟 DOM 环境

    Mocha 是一个在浏览器和 Node.js 环境中都能使用的 JavaScript 测试框架。而 jsdom 是一个用于模拟 DOM 环境的 JavaScript 库。

    1 年前
  • ES12 中的数组扁平化方法详解

    在前端开发中,我们经常需要处理多层嵌套的数组,而数组扁平化就是把嵌套的多层数组展开成一维数组的过程。ES12 中新增了数组扁平化的方法,这篇文章将会对这些方法进行详细介绍。

    1 年前
  • ECMAScript 2017 中的新特性

    ECMAScript 2017 是 JavaScript 语言的一个新版本,包括了一些新特性,这些特性旨在提高开发效率和代码质量。本文将介绍 ECMAScript 2017 中的新特性及其含义。

    1 年前
  • 为什么说 Web Components 是下一代 Web 标准

    Web Components 是一项新的 Web 标准,它可以让开发者更加方便地创建可重用的组件,并能够与现有的框架和库集成。它是目前最先进的前端开发技术之一,被誉为下一代 Web 标准。

    1 年前
  • Vue.js+Express.js 实战:开发一个简单的在线聊天室应用

    在线聊天室应用,早已不是一个新鲜的东西了。在当今社交网络蓬勃发展的时期,人们已经很容易地习惯了通过互联网和智能终端进行在线聊天。现在,我们将使用 Vue.js 和 Express.js 框架来实现一个...

    1 年前
  • CSS Flexbox 布局在 Safari 中的问题解决

    在现代网页开发中,CSS Flexbox 布局已经成为一种非常流行的布局方式,它能够帮助我们快速、简单地实现各种复杂布局效果。但是在 Safari 浏览器中,Flexbox 布局会出现一些问题,例如在...

    1 年前
  • ECMAScript 2020 中的动态导入和静态导入

    ECMAScript 2020 是最新一版的 JavaScript 标准。这个版本带来了很多有趣的新特性,包括动态导入和静态导入。在本文中,我们将介绍这两种导入方式的用法、优点和缺点,以及如何在编写前...

    1 年前
  • ESLint 中如何关闭指定规则来固定 Bug

    介绍 ESLint 是一个流行的 JavaScript 代码检查工具,它可以帮助开发者发现潜在的代码问题并保证代码的一致性和可读性。ESLint 的默认规则包括语法错误、代码风格、最佳实践等等。

    1 年前
  • Fastify 中使用 Faker 生成测试数据

    在进行前端开发时,我们经常需要使用测试数据来验证代码的正确性,同时也需要模拟真实的数据以便于开发和测试。而 Faker 这个 JavaScript 库则可以帮助我们快速生成各种类型的随机数据。

    1 年前
  • Mongoose 如何进行分页查询

    简介 Mongoose 是一个基于 Node.js 的 MongoDB 对象模型工具,可以非常方便地通过对象模型的方式来操作 MongoDB 数据库。在实际项目中,我们经常需要进行分页查询,以达到更好...

    1 年前
  • MongoDB 中的 Map-Reduce 框架详解

    MongoDB 中的 Map-Reduce 框架详解 在 MongoDB 数据库中,Map-Reduce 框架是一种很有用的技术,可以对数据集合进行处理和分析。Map-Reduce 框架由两个操作组成...

    1 年前
  • Custom Elements 实现过程中遇到的阶段性问题解决方法

    随着 Web 技术的不断发展,Web 开发变得越来越复杂,页面结构也变得越来越庞大和深奥。为了解决这个问题,Custom Elements API 应运而生。 Custom Elements API ...

    1 年前
  • Kubernetes 中 Secret 的使用与管理

    在 Kubernetes 中,应用程序的配置和敏感信息通常存储在 Secret 对象中。Secret 可以存储访问令牌、API 密钥、密码等敏感信息,使用 Base64 编码进行存储。

    1 年前

相关推荐

    暂无文章