Skip to main content

NestJS

对「全栈偏前端」岗位很友好:NestJS 是 TypeScript 优先的后端框架,借鉴 Angular 的模块化和依赖注入思想,底层默认基于 Express(可切 Fastify)。前端同学上手成本低,是目前 Node 后端面试的加分项。

核心架构

面试题:Nest 的三大核心概念?

  • Module(模块):用 @Module 组织功能单元,声明 controllersprovidersimportsexports。应用是一棵模块树,根是 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/resExpress 中间件
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 更轻、更自由但需自己搭架构。