本文详细讲解如何使用 Nest.js 快速搭建 RESTful API。内容涵盖项目初始化、核心文件解析、使用 CLI 生成 CRUD 模块、处理 GET/POST 请求参数,以及通过 TypeORM 连接 MySQL 数据库并实现数据持久化。同时介绍了中间件的配置与应用,帮助开发者掌握 Nest.js 接口开发的核心流程。
一、项目初始化
1. 安装脚手架
npm i -g @nestjs/cli
2. 创建项目
nest new 项目名称
3. 进入项目目录
4. 安装依赖
npm i
5. 启动项目,开启文件监视模式,实现自动重新编译和服务器重载
npm run start:dev
6. 查看启动端口号,进入程序入口文件 src/main.ts 进行确认
浏览器打开 http://localhost:3000/ 访问
二、核心文件介绍
app.controller.spec.ts 用于控制器的单元测试,具体用法尚不明确。
app.controller.ts 包含路由的基本控制器,负责处理业务逻辑及请求响应。
app.module.ts 应用程序的根模块定义文件。
app.service.ts 用于编写数据库查询逻辑的服务文件。
main.ts 应用程序的入口文件,通过调用核心函数NestFactory来创建 Nest 应用程序实例。
三、创建接口模块处理请求
为快速创建内置验证的 CRUD 控制器,可使用 CLI 提供的 CRUD 生成器:nest g resource [name]。
此处依据官方文档提示创建 cats 模块。
nest g resource cats
选择 REST API 风格。
此时 src 文件目录下已生成 cats 目录,请查看。
虽然创建了 cats 模块,但需确认其是否被引用。实际上,在应用程序的根模块里中已自动引入,这是因为使用nest g resource cats命令创建时自动完成了配置,十分便捷。
四、查看 cats 模块内容
1. 首先查看 controller,所有请求方法均定义于此。
首先注意头部引入了大量模块,具体含义暂不详述。
接着观察到一个@Controller('cats')装饰器,其中包含参数,推测为路由前缀。随后可见多个以 @ 开头的 post、get、delete 方法,这些即为接口定义,可使用 APIFox 进行请求测试。

执行 get 请求返回“This action returns all cats”,该结果并非直接编写,需追溯来源。
@Get()
findAll() {
return this.catsService.findAll();
}
在 controller 中发现调用了 service 方法,按住 Ctrl 键点击 findAll 进入cats.service.ts文件。该文件中包含一个findAll方法,返回英文字符串。为便于理解,需修改该返回值,例如改为中文或特定标识。

2. 当前地址较为单一,是否支持接收 query 参数?
支持接收。
若传入 ?sex=1,期望返回女字样。
实现方式:在 controller 顶部导入@nestjs/common中的 Req,并在方法参数中使用。
// 导入类型
import { Request } from 'express';
@Get()
findAll(@Req() req: Request): string {
console.log('req:', req.query);
return this.catsService.findAll(req.query.sex as string);
}
注:此处获取参数本可使用 @Query,但采用了上述方式,仅供参考。
此时打印出所有 query 参数,仅需返回女字即可。
cats.service.ts
findAll(sex: string) {
const sexObj = {
'0': '男',
'1': '女',
};
return sexObj[sex];
}
完成代码编写后,使用 APIFox 验证结果。

返回结果正确。若想在 post 请求中传递 param 参数,或查询数据库,可进一步配置。
五、连接 MySQL 数据库
首先安装数据库管理库typeorm和连接驱动mysql2。
npm install --save @nestjs/typeorm typeorm mysql2
然后在app.module.ts中添加相应配置。
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: '127.0.0.1',
port: 3306,
username: 'root',
password: 'root',
database: 'blog',
entities: ['dist/**/*.entity{.ts,.js}'],
synchronize: true,
}),
CatsModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
数据库连接成功。
当前使用typeorm管理数据库,该库通过实体映射至数据库表。传统方式需在数据库中直接创建表结构,现改为通过实体定义来生成表。接下来尝试具体操作。
在 cats 文件夹下存在一个entities文件夹,用于存放实体定义。打开后找到 ts 文件,在此编写实体代码,即定义数据库表结构。
具体代码如下:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
// 建立一个实体映射到数据库表
@Entity('cats')
export class Cat {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 10 })
name: string;
}
@Entity('cats') 装饰器表明该类为实体,名称为cats,包含字段:id、name。依据此结构,MySQL 中应自动创建名为 cats 的表。打开数据库验证是否生成该表。

验证无误后,再添加一个desc字段进行测试。

测试通过。
六、操作数据库
实体定义完成后,如何在代码中使用?
通常数据库操作在 service 层进行。以下直接展示代码,向数据库中插入一条数据。
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateCatDto } from './dto/create-cat.dto';
import { UpdateCatDto } from './dto/update-cat.dto';
import { Cat } from './entities/cat.entity';
@Injectable()
export class CatsService {
constructor(
@InjectRepository(Cat)
private readonly catRepository: Repository<Cat>,
) {}
async create(createCatDto: Partial<CreateCatDto>): Promise<Cat> {
console.log(createCatDto);
return this.catRepository.save(createCatDto);
}
}
保存时报错提示实体未引用,需在cats.module.ts中进行引入配置。
import { Module } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CatsController } from './cats.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Cat } from './entities/cat.entity';
@Module({
imports: [TypeOrmModule.forFeature([Cat])],
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
service 编写完成后,需在 controller 中调用。
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
Req,
} from '@nestjs/common';
import { CatsService } from './cats.service';
import { CreateCatDto } from './dto/create-cat.dto';
import { UpdateCatDto } from './dto/update-cat.dto';
import { Request } from 'express';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Post('/create')
create(@Body() createCatDto: CreateCatDto) {
console.log(createCatDto);
return this.catsService.create(createCatDto);
}
}
注意代码中的CreateCatDto来源。查看 cats 目录下的 dto 文件夹,存在一个create-cat.dto.ts文件,即由此导出。
export class CreateCatDto {
name: string;
desc: string;
}
使用 ApiFox 查看结果。

发送请求,无报错,前往数据库检查数据是否写入。

结果显示接口开发流程已跑通,操作相对简单。感谢阅读。
七、中间件的应用
按照惯例先创建对应文件,Nest.js 提供快捷创建中间件的命令。
nest g middleware middleware/reqMi
在 middleware 目录下创建了名为reqMi的中间件,命名较为简单。检查中间件内容。
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class ReqMiMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
console.log('你好,我是中间件');
next();
}
}
此处打印了一句话。调用中间件有多种方式,可参考官方文档。当前在app.module.ts中进行配置。
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(ReqMiMiddleware).forRoutes('cats');
}
}
ReqMiMiddleware已被调用,通过 forRoutes('cats') 指定该中间件适用于 cats 前缀的路由。Nest.js 中间件通过匹配路由路径触发,官方文档有详细说明。接下来验证调用是否成功。

控制台已打印日志。

中间件应用成功。
以上为使用 Nest.js 实现接口教程示例的详细内容,更多关于 Nest.js 接口教程的资料请关注本站其它相关文章!