Nest.js 接口开发实战:从初始化到数据库交互

作者:夜航船时间:2026-10-25 21:13:02浏览:376

本文详细讲解如何使用 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 接口教程的资料请关注本站其它相关文章!

作者最新文章