NestJs 实战应用
项目创建

准备工作
确保已安装 Node.js(自带 npx 和 npm)。创建新项目的步骤如下:
npm i -g @nestjs/cli # 全局安装 Nest CLI
nest new project-name # 创建新项目
项目创建完成后会初始化基础文件,并提示选择依赖管理工具(推荐使用 yarn 以提升速度)。
版本要求
Nest.js 需要 Node.js ≥10.13.0(v13 除外)。若版本不符,可通过 nvm 安装合适版本。
项目结构
src
├── app.controller.spec.ts # 控制器单元测试
├── app.controller.ts # 基础控制器
├── app.module.ts # 根模块
├── app.service.ts # 基础服务
└── main.ts # 应用入口文件
- main.ts:使用
NestFactory创建应用实例,可自定义监听端口(默认 3000)。 - app.module.ts:根模块,通过
@Module装饰器配置:providers:服务提供者(业务逻辑)controllers:路由控制器imports/exports:模块导入/导出
实现首个接口
-
启动服务
通过main.ts启动服务,默认监听 3000 端口:async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } -
模块与控制器
AppModule引入AppController和AppService- 控制器使用
@Controller装饰,服务通过依赖注入(@Injectable)调用
示例代码:
// app.controller.ts @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello() { return this.appService.getHello(); } } // app.service.ts @Injectable() export class AppService { getHello() { return 'Hello World!'; } }
路由装饰器
Nest.js 通过装饰器定义路由,无需单独配置文件。
路由配置示例
@Controller("app")
export class AppController {
// 固定路径
@Get("list") getList() { ... }
// 通配符路径
@Get("user_*") getUser() { ... }
// 参数路径
@Put("list/:id") update() { ... }
}
开发热更新
运行 npm run start:dev 启用实时监听文件变化。
全局路由前缀
在 main.ts 中设置:
app.setGlobalPrefix('api'); # 所有路由添加 /api 前缀
编写代码
首先介绍几个 Nest CLI 提供的实用命令:
nest g [文件类型] [文件名] [文件目录]
如需禁用测试文件生成,可在nest-cli.json中配置:
"generateOptions": {
"spec": false
}
创建模块
执行以下命令创建 posts 模块:
nest g mo posts
默认会在 posts 目录下生成posts.module.ts:
import { Module } from '@nestjs/common';
@Module({})
export class PostsModule {}
命令执行后,根模块app.module.ts会自动引入 PostsModule:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PostsModule } from './posts/posts.module';
@Module({
controllers: [AppController],
providers: [AppService],
imports: [PostsModule],
})
export class AppModule {}
创建控制器
执行命令创建控制器:
nest g co posts
生成posts.controller.ts及其测试文件:
import { Controller } from '@nestjs/common';
@Controller('posts')
export class PostsController {}
模块文件会自动更新,将控制器注入到@Module装饰器中。
创建服务类
执行命令创建服务:
nest g service posts
生成posts.service.ts:
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostsService {}
服务会自动注册到模块的 providers 中。
提示:Nest CLI 还支持创建过滤器、拦截器等,后续章节会介绍。创建顺序建议:先创建 Module,再创建 Controller 和 Service,这样能自动完成注册。
快速创建 CRUD
使用资源生成命令一键创建完整模块:
nest g resource user
该命令会自动:
- 创建 user 文件夹
- 在
app.module.ts中自动导入 - 生成包含基础 CRUD 操作的控制器模板:
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
// 其他CRUD方法...
}
请求处理示例
修改服务类返回自定义响应:
create(createUserDto: CreateUserDto) {
return {
code: 200,
result: '请求成功'
};
}
参数获取
获取POST请求体:
@Post()
create(@Body() createUserDto: CreateUserDto) {
console.log(createUserDto);
return this.userService.create(createUserDto);
}
获取特定字段:
create(@Body('name') name: string) {
console.log(name); // 输出"小月"
}
DTO 定义
在create-user.dto.ts中定义数据结构:
export class CreateUserDto {
name: string;
}
获取请求头
使用@Headers装饰器:
@Post()
create(@Body() createUserDto: CreateUserDto, @Headers() headers) {
console.log(headers);
return this.userService.create(createUserDto);
}
1921

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



