文档
NestJS 毕设实战 — 企业级架构入门
前言
如果你想让毕设代码看起来「专业」,NestJS 是最佳选择。它的模块化、依赖注入、装饰器风格让代码整洁且可测试。面试时拿出 NestJS 项目,面试官会眼前一亮。
第一章:理解依赖注入(DI)
NestJS 的核心是 IoC 容器(控制反转)。你不需要手动 new 对象,容器自动帮你组装:
// ❌ 传统方式 — 紧耦合
class UserController {
constructor() {
this.userService = new UserService(); // 写死了!
}
}
// ✅ NestJS 方式 — DI 注入
@Injectable()
class UserService { /* ... */ }
@Controller('users')
class UserController {
constructor(private readonly userService: UserService) {}
// Nest 自动将 UserService 实例注入进来
}
好处:
- 测试时可以用 Mock 替代真实 Service
- 单例管理,不会重复创建
- 模块间解耦
第二章:守卫(Guard)— 权限控制
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const token = request.headers.authorization?.split(' ')[1];
if (!token) return false;
try {
request.user = this.jwtService.verify(token);
return true;
} catch {
return false;
}
}
}
// 使用
@UseGuards(AuthGuard)
@Get('profile')
getProfile(@Req() req) {
return req.user;
}
第三章:TypeORM 集成
npm install @nestjs/typeorm typeorm sqlite3
// user.entity.ts
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true })
username: string;
@Column({ select: false }) // 查询时默认隐藏密码
password: string;
@CreateDateColumn()
createdAt: Date;
}
// users.service.ts
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private usersRepo: Repository<User>,
) {}
async findByUsername(username: string) {
return this.usersRepo.findOne({ where: { username } });
}
}
第四章:模块化组织
src/
├── auth/ # 认证模块
│ ├── auth.module.ts
│ ├── auth.controller.ts
│ ├── auth.service.ts
│ └── jwt.strategy.ts
├── users/ # 用户模块
│ ├── users.module.ts
│ ├── users.controller.ts
│ ├── users.service.ts
│ └── entities/user.entity.ts
├── common/ # 公共模块
│ ├── guards/
│ ├── decorators/
│ └── filters/
└── app.module.ts # 根模块
每个功能一个文件夹,模块间通过 imports: [UsersModule] 引用。
第五章:Swagger 文档 — 答辩加分项
npm install @nestjs/swagger swagger-ui-express
// main.ts
const config = new DocumentBuilder()
.setTitle('毕设 API')
.setDescription('学生管理系统接口文档')
.setVersion('1.0')
.addBearerAuth()
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api-docs', app, document);
访问 http://localhost:3000/api-docs 即可看到自动生成的 Swagger UI,答辩时直接浏览器演示接口!
思考题
- NestJS 的 Module 和 Angular 的 NgModule 有什么异同?
- Provider scope(DEFAULT/REQUEST/TRANSIENT)有什么区别?
- 如何在 NestJS 中实现请求级别的日志链路追踪?