NestJS 是一个基于 TypeScript 的渐进式 Node.js 框架,核心设计借鉴了 Angular 的模块化思想。下面从实际开发角度解析它的三大核心构建块,并附代码示例和避坑指南。
作用:模块是应用的骨架,用于按功能拆分代码。每个模块封装控制器、服务及相关依赖,通过@Module
装饰器定义。
// user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { AuthModule } from '../auth/auth.module'; // 导入其他模块
@Module({
imports: [AuthModule], // 依赖的外部模块
controllers: [UserController], // 注册控制器
providers: [UserService], // 注册服务(可注入对象)
exports: [UserService] // 暴露服务供其他模块使用
})
export class UserModule {}
使用建议:
UserModule
、OrderModule
,避免单个模块膨胀LazyModuleLoader
提升启动速度避坑指南:
forwardRef(() => ModuleB)
解决作用:处理路由、接收参数、返回响应,通过装饰器如@Controller
、@Get
定义。
// user.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('users') // 路由前缀 /users
export class UserController {
// 依赖注入:框架自动实例化 UserService
constructor(private readonly userService: UserService) {}
@Get(':id') // GET /users/123
async getUser(@Param('id') id: string) {
const user = await this.userService.findUser(id);
return { code: 200, data: user }; // 自动序列化为JSON
}
// 示例:POST 请求处理
@Post()
createUser(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
}
使用建议:
@Query()
获取URL参数@Body()
获取请求体@Headers()
获取请求头class-validator
做参数校验(示例见下文)避坑指南:
{code, data}
)方便前端处理作用:通过@Injectable
装饰的类(如Service、Repository),实现业务逻辑复用,通过依赖注入使用。
// user.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
@Injectable() // 标记为可注入类
export class UserService {
private users: User[] = []; // 示例用内存存储
findUser(id: string): User | undefined {
return this.users.find(u => u.id === id);
}
create(userDto: CreateUserDto): User {
const newUser = { id: Date.now().toString(), ...userDto };
this.users.push(newUser);
return newUser;
}
}
使用建议:
constructor(
private userService: UserService,
private emailService: EmailService // 其他服务
) {}
避坑指南:
@Inject(forwardRef())
完整请求流程:
// create-user.dto.ts
import { IsEmail, IsString } from 'class-validator';
export class CreateUserDto {
@IsEmail()
email: string;
@IsString()
password: string;
}
@Post()
async createUser(
@Body(new ValidationPipe()) userDto: CreateUserDto // 自动验证
) {
const user = await this.userService.create(userDto);
return { code: 201, data: user };
}
// app.module.ts
@Module({
imports: [UserModule, AuthModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
架构优势:
性能优化点:
CacheInterceptor
缓存高频请求@HttpCode(202)
快速响应,后台异步处理@UseGuards(JwtAuthGuard)
实现路由级权限控制常见错误:
forwardRef
解决,或重新设计模块结构通过合理运用这些构建块,可以打造出高维护性、易扩展的NestJS应用。建议结合Swagger文档生成(@nestjs/swagger
)和单元测试(Jest)提升代码质量。