如何构建可扩展的 GraphQL 架构

面试官:小伙子,你的代码为什么这么丝滑?

GraphQL 是一种由 Facebook 开发的查询语言,用于开发 API。GraphQL 的优点在于它允许您指定需要的数据,并使多个请求合并为一个请求。这使得 GraphQL 适用于移动应用程序,因为它可以减少网络请求次数。在本文中,我们将讨论如何构建可扩展的 GraphQL 架构。

1. 理解 GraphQL 架构

GraphQL 架构由类型和解析器组成。类型定义了查询语言中的可用字段和关系。解析器是在查询时被调用的函数,用于检索和组织数据。在 GraphQL 中,您需要定义两个类型:查询和突变。查询用于检索数据,突变用于更改数据。

例如,以下是一个简单的 GraphQL 查询:

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

在上面的查询中,我们向查询窗口添加了一个 user 字段,并传递了一个 id 参数。我们还要求 GraphQL 检索 nameemailposts 数据。

2. 设计可扩展的 GraphQL 架构

构建可扩展的 GraphQL 架构的关键是正确定义类型和解析器。定义类型时,必须考虑未来如何扩展数据模型。以下是一些有用的模式:

2.1. 将关联数据类型成为 GraphQL 类型

将关联数据类型成为 GraphQL 类型是构建可扩展 GraphQL 架构的关键。例如,假设我们有一个 Post 类型和一个 User 类型。在 User 类型中,我们添加一个 posts 字段以返回与 User 相关联的所有帖子。

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

Django 的关系模型(OneToMany, ManyToMany)或SQLAlchemy都支持关联数据的定义。

2.2. 使用接口定义类型

使用接口定义类型可以在类型层面上创建共享行为。例如,我们可以使用接口将 PostComment 类型定义为共享 idcontent 字段的类型。

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

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

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

2.3. 使用 union 类型

使用 union 类型表示不相交的类型。例如,我们可以使用 union 类型定义一个 SearchResult 类型,该类型可以包括 PostComment

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

这样,我们就可以将 SearchResult 返回到查询中,并使用类型保护(type guard)来确定它是否是 Post 还是 Comment

3. 编写 GraphQL 解析器

编写 GraphQL 解析器时,应该关注以下几点:

3.1. 使用批处理 API 来优化异步磨损

使用批处理 API 可以改善 GraphQL API 的性能。例如,使用 DataLoader 可以减少对数据库的查询次数。

3.2. 实现 RBAC

实现基于角色的访问控制 (RBAC) 可以确保未经授权的用户无法访问机密数据。根据不同上下文分离不同的角色或使用中间件或多个解析器组成 pipeline 来增强顺序控制和权限管理。

3.3. 防止 DoS 攻击

防止拒绝服务 (DoS) 攻击可以通过防止花费过多的时间对请求 Ranker 或将操作范围限制为可处理的最小数据集来实现。graphql-proteus 是一种 GraphQL API 网关,可以防止 DoS 攻击。

4. 示例代码

以下是使用 Node.js、GraphQL 和 Apollo Server 构建可扩展的 GraphQL 架构的示例代码:

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

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

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

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

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

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

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

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

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

在上面的代码中,我们定义了一个 User 类型和一个 Post 类型,并使用 Mongoose 模型来定义它们的行为。我们还定义了一个 Query 类型,它包括了 userpostposts 字段。

在解析器中,我们实现了这些字段的逻辑。我们使用 findByIdfind 方法从数据库中获取数据,并使用 asyncawait 来确保异步函数的正确执行。我们还定义了 PostUser 类型之间的关系,在 Post 类型的解析器中使用了关联数据。

结论

在本文中,我们介绍了如何构建可扩展的 GraphQL 架构。正确定义类型和解析器是构建可扩展 GraphQL 架构的关键。GraphQL 具有许多优点,但为了获得最佳性能和可扩展性,您应该牢记讨论中列出的最佳实践。

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


猜你喜欢

  • 响应式设计中的清除浮动问题及方案

    在进行响应式设计时,通常都会遇到浮动元素引起的问题。在使用浮动元素时,需要注意浮动元素的位置和大小,否则页面布局可能会出现混乱的情况。为了避免这种情况,我们需要在浮动元素后面加上清除浮动。

    14 天前
  • Docker 容器中如何安装 PostgreSQL?

    前言 在前端开发过程中,我们经常需要使用到各种数据库,比如 PostgreSQL。而在使用 Docker 搭建开发环境时,我们需要在容器中安装 PostgreSQL。

    14 天前
  • 为什么选择 Serverless 架构?

    随着云计算的发展,越来越多的企业开始关注 Serverless 架构。Serverless 架构是一种全新的应用架构模型,具有许多优点,如可扩展性、高可用性、低成本等。

    14 天前
  • 使用 TypeScript 编写 RESTful API 时遇到的坑和解决方案

    在开发 RESTful API 的过程中,使用 TypeScript 可以大大提高代码的可读性、可维护性和健壮性。但是,我们也会遇到一些坑点。在本文中,我们将分享一些在编写 TypeScript 中 ...

    14 天前
  • Cypress 测试 React 应用时如何模拟异步数据

    在前端开发的过程中,我们经常会遇到需要模拟异步数据来测试页面展示的情况。针对 React 应用,Cypress 提供了多种方法来模拟异步数据,使得我们的测试能够更加健壮可靠。

    14 天前
  • 如何使用 ES12 的 for-await-of 来处理异步 Iterable

    随着前端应用变得越来越复杂,异步编程(asynchronous programming)已成为非常重要的一部分,但在使用 Promise、async/await 等异步编程技术时也会遇到一些问题,例如...

    14 天前
  • 如何在 CSS Flexbox 布局中实现图文混排

    CSS Flexbox 布局是一种流行的前端布局技术,可以轻易地实现自适应、可伸缩的布局,同时也支持图文混排。本文将详细介绍如何在 Flexbox 布局中实现图文混排,并提供示例代码和实践指导,帮助读...

    14 天前
  • 无障碍演示技巧

    随着互联网的不断发展和普及,越来越多的人使用互联网进行学习、娱乐和工作等。但是有一类人群却面临着障碍,他们是视觉障碍者、听觉障碍者以及行动障碍者等。为了让我们的网站和应用更具包容性,我们需要考虑到障碍...

    14 天前
  • 如何在 Jest 测试中模拟简单重定向

    当开发一个前端应用时,我们需要经常测试我们的代码。针对每个组件和功能进行测试可以帮助我们确保应用程序正常工作,并且随时可以检测到和修复错误。在现代的前端应用程序中,我们通常使用 Jest 作为我们的测...

    14 天前
  • 经验分享:如何在 Webpack 中构建 Web Components?

    Web Components 是一种浏览器的原生组件,有着许多优秀的特性,包括封装、复用、解耦等。在现今的 Web 开发中越来越受到开发者们的关注和使用。 Webpack 作为前端领域最受欢迎的模块打...

    14 天前
  • 如何使用 JProfiler 进行 Java 程序性能分析与调优

    随着Web应用程序越来越复杂和庞大,优化程序的性能变得日益重要。 JProfiler是一款功能强大的Java性能分析器,可以帮助您找出性能问题,并提供有用的信息来改进您的代码。

    14 天前
  • 使用 Fastify 和 PostgreSQL 的 RESTful API 教程

    近年来,随着前端技术的飞速发展,越来越多的人开始热衷于开发 RESTful API。使用 Fastify 和 PostgreSQL 结合开发 RESTful API 成为了一种常见的方式。

    14 天前
  • Webpack 的性能优化实践

    Webpack 是前端开发中不可或缺的构建工具之一,它可以将多个文件打包成一个或多个 bundle,并处理依赖关系、转换 ES6、Less 等语法等等。然而,随着项目复杂度的不断提升,Webpack ...

    14 天前
  • Chai 插件 - 标准库集成

    Chai 是一个流行的 JavaScript 测试库,允许开发者编写可读性高、易于维护的测试用例。Chai 插件允许开发者对 Chai 进行扩展,使其可以支持自定义的行为和断言。

    14 天前
  • Express.js 中的代码注释技巧与方法

    在 Express.js 中,代码注释是一种重要的技巧,可以帮助开发者更好地理解代码,更好地维护和修改代码。在本文中,我们将介绍一些 Express.js 中的代码注释技巧和方法,希望对学习和使用 E...

    14 天前
  • 使用 Server-sent Events 和 React Native 构建实时聊天应用

    介绍 在今天的互联网世界中,实时通信已经成为了现代应用程序的必需品。实时通信能够为用户带来更好的使用体验,例如实时消息通知、社交网络、游戏和在线聊天等。本文将介绍如何使用 Server-sent Ev...

    14 天前
  • 解决在 Material Design 中使用 BottomNavigationView 的问题

    在 Android 开发中,Material Design 是一个流行的 UI 设计语言,BottomNavigationView 是 Material Design 中的一个组件。

    14 天前
  • 使用 Headless CMS 和 React 构建即时聊天应用程序

    前言 聊天应用程序是现代化的通讯方式之一,它可以让人们在不同位置,不同时区之间进行实时的通信,而不受时间和空间的限制。如今,随着移动设备的广泛使用,即时聊天应用程序已经成为人们日常生活中必不可少的工具...

    14 天前
  • Mocha 报错 TypeError: done is not a function 怎么办?

    在前端自动化测试中,Mocha 是一种流行的测试框架。它提供了一些简洁易用的 API,可以让我们编写高效的测试用例。然而,在使用 Mocha 进行测试时,有时候会遇到 “TypeError: done...

    14 天前
  • 解决使用TailwindCSS后样式没有覆盖原先的问题

    TailwindCSS 是一种流行的 CSS 框架,它提供了丰富的 CSS 类名称,让开发者能够快速创建美观的界面。然而,使用 TailwindCSS 可能会遇到一个常见的问题,即在 Tailwind...

    14 天前

相关推荐

    暂无文章