如何使用 NestJS 构建 GraphQL API

本教程介绍如何使用 NestJS 构建 GraphQL API。先说明了 NestJS 是 TypeScript Node.js 框架,支持 RESTful 和 GraphQL API 设计。接着演示初始化 NestJS 应用程序、构建 GraphQL API 的步骤,包括各组件介绍。最后阐述使用 GraphQL API 具有请求快、灵活等好处。

本 GraphQL 和 NestJS 教程最后更新于 2023 年 8 月,旨在探索使用 GraphQL API 的好处。

NestJS是一个TypeScript Node.js框架,可帮助您构建企业级,高效且可扩展的Node.js应用程序。它支持 RESTful 和 GraphQL API 设计方法。

GraphQL 是一种用于 API 的查询语言,也是使用现有数据完成这些查询的运行时。它提供了 API 中数据的完整且易于理解的描述,使客户能够准确询问他们需要的内容,使随着时间的推移更容易发展 API,并有助于使用强大的开发人员工具。

在本教程中,我们将演示如何使用 NestJS 来构建和利用 GraphQL API 的强大功能。我们将介绍以下内容:

初始化 NestJS 应用程序

启动 Nest 项目很简单,因为 Nest 提供了一个可用于生成新项目的 CLI。如果你安装了 npm,你可以使用以下命令创建一个新的 Nest 项目:

npm i -g @nestjs/cli
nest new project-name

Nest 将使用 project-name 并添加样板文件创建一个项目目录:

NestJS Boilerplate Files

在后台,Nest 公开了一个 GraphQL 模块,该模块可以配置为在 Nest 应用程序中使用 Apollo GraphQL 服务器。要将 GraphQL API 添加到我们的 Nest 项目中,我们需要安装 Apollo Server 和其他 GraphQL 依赖项:

$ npm i --save @nestjs/graphql graphql-tools graphql apollo-server-express

安装依赖项后,您现在可以导入 GraphQLModule AppModule 到 :

// src/app.module.ts

import {
   
    Module } from '@nestjs/common';
import {
   
    GraphQLModule } from '@nestjs/graphql';

@Module({
   
   
  imports: [
    GraphQLModule.forRoot({
   
   }),
  ],
})

export class AppModule {
   
   }

GraphQLModule 是 Apollo Server 上的包装器。它提供了一个静态方法 , forRoot() 用于配置底层 Apollo 实例。该方法 forRoot() 接受传递到 ApolloServer() 构造函数的选项列表

在本文中,我们将使用代码优先方法,该方法使用装饰器和 TypeScript 类来生成 GraphQL 模式。对于这种方法,我们需要将 autoSchemaFile 属性(创建生成的模式的路径)添加到我们的 GraphQLModule 选项中:

// src/app.module.ts

import {
   
    Module } from '@nestjs/common';
import {
   
    GraphQLModule } from '@nestjs/graphql';

@Module({
   
   
  imports: [
    GraphQLModule.forRoot({
   
   
       autoSchemaFile: 'schema.gql'
    }),
  ],
})

export class AppModule {
   
   }

也可以 autoSchemaFile 设置为 true ,这意味着生成的架构将保存到内存中。

Nest与数据库无关,这意味着它允许与任何数据库集成:对象文档映射器(ODM)或对象关系映射器(ORM)。出于本指南的目的,我们将使用 PostgreSQL 和 TypeORM。

Nest团队建议将TypeORM与Nest一起使用,因为它是TypeScript可用的最成熟的ORM。因为它是用TypeScript编写的,所以它与Nest框架集成得很好。Nest 提供了使用 TypeORM 的 @nestjs/typeorm 软件包。

让我们安装这些依赖项来使用 TypeORM 数据库:

$ npm install --save @nestjs/typeorm typeorm pg

安装过程完成后,我们可以使用以下命令 TypeOrmModule 连接到数据库:

// src/app.module.ts

import {
   
    Module } from '@nestjs/common';
import {
   
    AppController } from './app.controller';
import {
   
    AppService } from './app.service';
import {
   
    GraphQLModule } from '@nestjs/graphql';
import {
   
    TypeOrmModule } from '@nestjs/typeorm';

@Module({
   
   
  imports: [
    GraphQLModule.forRoot({
   
   
      autoSchemaFile: 'schema.gql'
    }),
    TypeOrmModule.forRoot({
   
   
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'godwinekuma',
      password: '',
      database: 'invoiceapp',
      entities: ['dist/**/*.model.js'],
      synchronize: false,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {
   
    }

构建 GraphQL API

Nest 提供了两种构建 GraphQL API 的方法:Code-First 和 Schema-First。代码优先方法涉及使用 TypeScript 类和装饰器来生成 GraphQL 模式。使用此方法,可以将数据模型类重用为架构,并使用 @ObjectType() 修饰器对其进行修饰。Nest 将从您的模型自动生成架构。同时,模式优先方法涉及使用 GraphQL 的模式定义语言 (SDL) 定义模式,然后通过匹配模式中的定义来实现服务。

如前所述,本文将使用代码优先方法。使用此方法, @nestjs/graphql 通过读取 TypeScript 类定义的装饰器中指定的元数据来生成模式。

GraphQL 组件

GraphQL API 由多个组件组成,这些组件执行 API 请求或形成其响应的对象。

Resolvers

解析器提供将 GraphQL 操作(查询、更改或订阅)转换为数据的说明。它们要么返回我们在架构中指定的数据类型,要么返回该数据的承诺。

@nestjs/graphql 包使用用于批注类的修饰器提供的元数据自动生成解析程序映射。为了演示如何使用包功能来创建 GraphQL API,我们将创建一个简单的发票 API。

Object Types

对象类型是 GraphQL 最基本的组件。它是可以从服务中提取的字段集合,每个字段声明一个类型。每个定义的对象类型表示 API 中的一个域对象,指定可在 API 中查询或更改的数据的结构。例如,我们的示例发票 API 需要能够获取客户及其发票的列表,因此我们应该定义 Customer and Invoice 对象类型以支持此功能。

对象类型用于定义 API 的查询对象、突变和架构。因为我们使用的是代码优先方法,所以我们将使用 TypeScript 类定义模式,然后使用 TypeScript 装饰器来注释这些类的字段:

// src/invoice/customer.model.ts

import {
   
    Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm';
import {
   
    ObjectType, Field } from '@nestjs/graphql';
import {
   
    InvoiceModel } from '../invoice/invoice.model';

@ObjectType()
@Entity()
export class CustomerModel {
   
   
  @Field()
  @PrimaryGeneratedColumn('uuid')
  id: string;
  @Field()
  @Column({
   
    length: 500, nullable: false })
  name: string;
  @Field()
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Willin 老王躺平不摆烂

感谢你这么好看还这么慷慨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值