NestJS 毕设实战 — 企业级架构入门

知识库
知识库文档
/tech-stacks/nestjs/tutorial/NestJS 毕设实战 — 企业级架构入门.md

文档

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,答辩时直接浏览器演示接口!

思考题

  1. NestJS 的 Module 和 Angular 的 NgModule 有什么异同?
  2. Provider scope(DEFAULT/REQUEST/TRANSIENT)有什么区别?
  3. 如何在 NestJS 中实现请求级别的日志链路追踪?

信息

路径
/tech-stacks/nestjs/tutorial/NestJS 毕设实战 — 企业级架构入门.md
更新时间
2026/5/30