NestJS
对「全栈偏前端」岗位很友好:NestJS 是 TypeScript 优先的后端框架,借鉴 Angular 的模块化和依赖注入思想,底层默认基于 Express(可切 Fastify)。前端同学上手成本低,是目前 Node 后端面试的加分项。
核心架构
面试题:Nest 的三大核心概念?
- Module(模块):用
@Module组织功能单元,声明controllers、providers、imports、exports。应用是一棵模块树,根是AppModule。 - Controller(控制器):处理路由,接收请求、返回响应。
- Provider(提供者 / Service):封装业务逻辑,通过依赖注入被使用。
@Controller("users")
export class UserController {
// 构造函数注入,无需手动 new
constructor(private readonly userService: UserService) {}
@Get(":id")
findOne(@Param("id") id: string) {
return this.userService.findOne(+id);
}
@Post()
create(@Body() dto: CreateUserDto) {
return this.userService.create(dto);
}
}
@Injectable()
export class UserService {
findOne(id: number) {
/* ... */
}
}
依赖注入(DI)
面试题:什么是依赖注入?Nest 怎么实现的?
- 控制反转(IoC):对象不自己创建依赖,而是由容器创建并注入。降低耦合、方便替换和测试(可注入 mock)。
- Nest 维护一个 IoC 容器,启动时根据
@Injectable元数据(依赖reflect-metadata读取构造函数参数类型)解析依赖关系并实例化,默认单例。
请求生命周期组件
面试题:Nest 的 Guard / Pipe / Interceptor / Filter 各自作用?执行顺序?
| 组件 | 作用 | 类比 |
|---|---|---|
| Middleware | 最先执行,处理原始 req/res | Express 中间件 |
| Guard | 鉴权/权限判断,返回 boolean 决定是否放行 | 路由守卫 |
| Interceptor(前置) | 请求前增强(如开始计时、改造入参) | AOP 环绕 |
| Pipe | 参数校验与转换(配合 class-validator) | 校验器 |
| Controller / Service | 业务处理 | - |
| Interceptor(后置) | 响应后增强(统一响应格式、缓存、日志) | AOP 环绕 |
| Exception Filter | 捕获异常、统一错误响应 | try-catch |
执行顺序大致:Middleware → Guard → Interceptor(前) → Pipe → 处理函数 → Interceptor(后) → Filter(出错时)。
装饰器
Nest 大量用装饰器(依赖 TS 的 experimentalDecorators + reflect-metadata):
- 类装饰器:
@Module、@Controller、@Injectable - 方法装饰器:
@Get、@Post、@UseGuards - 参数装饰器:
@Param、@Body、@Query、@Req,也可自定义@CurrentUser()
常见生态
- TypeORM / Prisma:数据库 ORM。
@nestjs/passport+ JWT:鉴权。@nestjs/swagger:自动生成 API 文档。class-validator+ValidationPipe:DTO 参数校验。@nestjs/config:环境配置管理。
面试题:Nest 和 Express/Koa 的关系?
Nest 是上层框架,默认用 Express 做底层 HTTP 引擎(adapter 模式,可换 Fastify)。它在 Express 之上提供了 DI、模块化、装饰器路由、AOP(守卫/拦截器/过滤器)等架构能力,适合中大型工程;Express/Koa 更轻、更自由但需自己搭架构。