本 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 并添加样板文件创建一个项目目录:

在后台,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()

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

被折叠的 条评论
为什么被折叠?



