如何在 Nest.js 中使用 GraphQL

简介

GraphQL 是一种用于 API 的查询语言和运行时环境。它提供了一种更有效、更强大和更灵活的替代 REST,可以满足不同客户端的数据请求需求。Nest.js 是一款基于 Node.js 平台的现代化 Web 开发框架,它提供了模块化、面向切面编程、依赖注入和 MVC 等高级特性。

在本文中,我们将探讨如何在 Nest.js 应用程序中使用 GraphQL,包括安装和配置、定义数据模型、声明查询和变异等内容。我们将借助第三方库 @nestjs/graphqlgraphql-tools 来完成 GraphQL 的实现。

安装和配置

在开始之前,请确保已经安装了 Node.js 和 Nest.js,它们分别在官方网站

安装完毕后,我们可以在终端中使用以下命令创建一个新的 Nest.js 应用程序:

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

然后,我们可以在应用程序的根目录中安装 @nestjs/graphqlgraphql-tools

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

接下来,我们需要在 app.module.ts 文件中导入和配置 GraphQLModule,如下所示:

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

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

这里,我们使用 GraphQLModule.forRoot() 方法来配置 GraphQLModule 的选项。其中 autoSchemaFile 用来指定保存 GraphQL 模式的文件名,后面我们将会详细讲解。

定义数据模型

在使用 GraphQL 时,我们首先需要定义数据模型。在 Nest.js 中使用 GraphQL,我们通常会创建一个 input 类来表示客户端传入的数据,一个 type 类来表示输出给客户端的数据。

src 目录下,创建一个名为 cats 的模块,包括 modelsresolvers 两个子模块。在 models 子模块下,我们创建名为 cat.input.tscat.type.ts 文件,分别声明 CatInputCatType 类型。具体代码如下:

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

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

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

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

在上面的代码中,我们通过 @InputType()@ObjectType() 装饰器来定义 CatInputCatType 类型。@Field() 装饰属性和/或方法,以指定 GraphQL 类型。在 CatType 类型中,我们还定义了一个 ID 字段,用于区分每只猫。此 ID 字段不需要从客户端传入,因此不需要在 CatInput 类型中定义。

声明查询

在定义数据模型后,我们需要声明查询语句。在 Nest.js 中使用 GraphQL,我们需要在 resolvers 子模块中创建一个新的 cats.resolver.ts 文件。在这个文件中,我们使用 @Query() 装饰器来定义一个名为 getCats 的查询,查询所有猫的信息。具体代码如下:

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

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

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

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

在上面的代码中,我们首先在 @Resolver() 装饰器中声明该类是一个 GraphQL 解析器。然后,我们声明了一个名为 getCats() 的查询函数,当客户端进一步指定查询猫信息时,调用这个函数。我们也声明了一个 createCat() 函数,用于将新的猫信息添加到 cats 数组中。

注意 @Query(() => [CatType]) 中的 CatType 是在上一步中定义的输出类型。

生成 GraphQL 模式

在定义数据模型和查询解析器后,我们需要使用 graphql-tools 来生成可执行的 GraphQL 模式。我们通过 buildSchema 方法来将上述定义和声明编译为 GraphQL 模式。为此,我们在 src/cats/cats.service.ts 文件中创建一个新的 CatsService 类,具体代码如下:

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

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

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

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

在代码中,我们使用了 makeExecutableSchema 方法来生成可执行的 GraphQL 模式。

typeDefs 用于声明我们定义的 CatTypeCatInput 类型。Query 子类型用于声明我们定义的查询方法,如 getCatsMutation 子类型用于声明我们定义的变异方法,如 createCatresolvers 对象把 getCats 方法和 createCat 方法绑定到查询解析器中。

getSchema 方法被注入为 Nest.js 服务的一个方法,任何请求使用我们生成的可执行 schema 处理。它将被用于在 HTTP 底层 API 中注册 GraphQL 模式。

app.module.tsGraphQLModule.forRoot() 方法中,我们使用 SchemaModule 模块配置,如下所示:

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

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

GraphQLModule.forRootAsync() 中,我们使用 useFactory 方法注入 CatsService 服务,并且将 schema 配置为 CatsService.getSchema() 方法生成的 schema。让我们考虑一下 autoSchemaFile 属性。这个属性只是把它合成的 GraphQL schema 输出到它指定的文件。如果使用 useSchema 配置 GraphQLModule schema,则 autoSchemaFile 选项将被忽略。

使用 Playground 来测试

最后,我们需要启动应用程序,并使用 GraphQL Playground 来测试我们的查询和变异。我们使用以下命令启动应用程序:

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

在浏览器中打开 http://localhost:3000/graphql,我们就可以进入 GraphQL Playground 了。此时,我们可以打开 DOCS 标签页来查看我们定义的查询和变异方法。具体代码如下:

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

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

以上查询可以分别用于获取所有猫的信息和添加一只新的猫。GraphQL Playground 会在右侧的 RESULT 标签页中显示响应的 JSON 数据。

总结

在本篇文章中,我们介绍了如何在 Nest.js 中集成 GraphQL。我们通过安装和配置 @nestjs/graphqlgraphql-tools 帮助来使用 GraphQL。我们也定义了数据模型,声明了查询和变异方法。最后,我们使用 GraphQL Playground 来测试我们的查询和变异方法。如果您还没有使用 GraphQL,我希望此文可以帮助您了解更多关于 GraphQL 的知识。如果您对此有任何疑问或意见,请在评论中留言。

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


猜你喜欢

  • Kubernetes 中的可伸缩性实践

    随着云计算技术的不断发展,容器技术逐渐成为了云原生应用开发的主流方式。而 Kubernetes 作为目前最受欢迎的容器编排系统,其可伸缩性是其最重要的特性之一。在本文中,我们将探讨 Kubernete...

    1 年前
  • 解决 Cypress 中查找元素超时的问题

    Cypress 是一款集成测试框架,它的一个重要特点是可以直接在浏览器中运行测试,以便于前端开发人员进行测试和调试。在使用 Cypress 进行测试时,经常会遇到查找元素超时的问题,这时可以采取以下几...

    1 年前
  • Next.js Auth 应用实践

    什么是 Next.js Auth? Next.js Auth 是一款基于 Next.js 框架的身份认证解决方案。它集成了多种身份认证方式(如 JWT、OAuth、HttpOnly Cookie)并提...

    1 年前
  • RxJS 全面总结:解析 Observable 对象

    在前端开发中,RxJS 是一个非常常用且有效的工具包,它提供了一种响应式编程的方法,能够简化复杂的异步操作,使代码更加简洁、优雅。在本文中,我们将全面总结 RxJS,从 Observable 对象入手...

    1 年前
  • Socket.io 常见问题及解决方案汇总

    什么是 Socket.io? Socket.io 是一个用于实时通信的库,基于 WebSockets, 但是兼容不支持 WebSockets 的浏览器。 Socket.io 的优势 能够在浏览器和服...

    1 年前
  • ES9 中的 Object.values 方法使用详解

    在 ES9 中,Object 对象新增了一个静态方法 Object.values,该方法可以将一个对象的所有属性值提取出来,组成一个数组并返回。本文将详细介绍该方法的使用方法和示例,帮助读者更好地了解...

    1 年前
  • 如何使用 React Native 来启动一个屏幕保护程序

    在这篇技术文章中,我们将讨论如何使用 React Native 来启动一个屏幕保护程序。虽然React Native主要是用于移动应用程序开发的,但它仍然可以应用于屏幕保护程序的开发。

    1 年前
  • 使用 CSS Reset 后如何还原 a 标签的下划线

    在进行前端开发时,我们通常会使用 CSS Reset 工具来消除浏览器默认样式的影响,以达到更好的样式控制效果。然而,在进行网站开发时,经常需要给链接添加下划线,那么如何还原 a 标签的下划线呢? C...

    1 年前
  • 如何使用 Tailwind CSS 构建高度自定义的 SaaS 风格站点

    随着 SaaS(Software as a Service)的发展,许多企业选择将自己的服务部署在线上,提供给用户使用。在这样的背景下,如何搭建一款美观、易用、具有良好用户体验的 SaaS 站点,成了...

    1 年前
  • 移动端无障碍性需求分析

    前言 随着移动设备的普及,越来越多的人使用移动设备访问网站和应用程序。对于许多人来说,这是一种方便的方式,但对于那些有视力、听力或其他障碍的人来说,使用移动设备可能会带来一些困难。

    1 年前
  • LESS 中如何实现字体图标?

    在前端开发中,字体图标是一种流行的跨平台交付方式,它可以解决像素化问题,并拥有更好的缩放和跨浏览器支持性。而在 LESS 中,我们可以很方便地实现字体图标的相关操作。

    1 年前
  • 如何使用 Jest 进行 React 组件的交互测试?

    Jest 是一个流行的 JavaScript 测试框架,它具有易用性和高度的可定制化。在前端开发中,我们通常需要测试我们的 React 组件是否正常工作,而 Jest 是一个非常适合进行这项工作的工具...

    1 年前
  • 如何使用 Postman 测试 RESTful API?

    Postman 是一款非常易用的工具,它可以帮助我们在前端开发的过程中进行 API 的测试。如果你正在开发一个 RESTful API,那么 Postman 就是必不可少的工具之一。

    1 年前
  • Redux 使用中遇到的 TypeScript 问题及解决方案

    Redux 是 React 生态圈中的一种状态管理库,常常与 React 一起使用,帮助开发者管理 React 应用的状态、提升组件之间通信的效率等。相比传统的 Redux,使用 TypeScript...

    1 年前
  • 在 ES6 中使用 Object.assign() 方法

    介绍 JavaScript 是一种支持面向对象编程的语言,对象是 JavaScript 中最重要的概念之一。Object.assign() 是 ES6 中提供的一个用于对象合并的方法,可以将多个对象合...

    1 年前
  • ECMAScript 2021:VSCode 工具的 JavaScript 调试技巧

    JavaScript 是一门广泛应用于网页开发的编程语言,而 VSCode 是前端开发中相当受欢迎的代码编辑器。VSCode 提供了丰富的调试功能,使得开发者可以在调试过程中逐行执行代码、监视变量值和...

    1 年前
  • 经验分享:如何优化 Express.js 应用性能

    Express.js 是 Node.js 中最流行的开发框架之一,它易于使用且扩展性强。然而,在处理大量请求时,性能问题可能会成为瓶颈。本篇文章将深入探讨如何分析 Express.js 应用程序的性能...

    1 年前
  • 探究面向对象编程的性能优化思想

    在前端开发中,面向对象编程(Object-Oriented Programming,OOP)是一种非常常见的编程范式。面向对象编程的核心思想是将现实世界中的实体抽象成为对象,并通过定义对象的属性和方法...

    1 年前
  • Docker 容器中的时区如何设置?

    在使用 Docker 容器时,时区的问题经常是一个需要解决的问题。由于 Docker 容器是一个独立的运行环境,它与主机系统的时区可能不同,这会导致一些时间相关的问题,例如日志和应用程序中显示的时间是...

    1 年前
  • Deno 中如何使用 WebSocket 发送二进制数据

    WebSocket 是一种支持双向通信的网络传输协议,可以让 Web 应用程序实时交换信息。在 Deno 中使用 WebSocket 可以轻松地实现双向通信,本文就来介绍一下如何使用 WebSocke...

    1 年前

相关推荐

    暂无文章