跳到主要内容

NestJS 装饰器速查——作用与使用场景

4 分钟阅读

在 NestJS 里,装饰器就是给类、方法、参数「贴标签」:告诉框架这个类是模块还是控制器、这个方法处理哪种 HTTP 请求、这个参数从哪拿值。下面按模块与类声明 → 依赖注入 → 路由与取参 → AOP 与元数据 → 控制响应分块整理,每类说明作用典型场景,方便查阅。


一、模块与类声明:告诉 Nest「这是什么」

装饰器作用典型场景
@Module()声明这是一个 Nest 模块,在装饰器里配置 controllersprovidersimportsexports每个功能一块(如 UserModuleOrderModule),在根模块里 imports 进来
@Controller()声明这是模块里的控制器,可传路径前缀如 @Controller('user')处理 HTTP 请求的类,里面用 @Get()@Post() 等定义接口
@Injectable()声明这个类可以被 DI 容器创建、并注入到别的类里(即作为 provider)Service、Guard、Pipe、Interceptor 等,凡是要被 constructor 注入的都要加
@Global()声明这是全局模块,其 exports 的 provider 在整个应用里都可注入,不用在每个模块里 imports配置模块、数据库模块等「到处都要用」的模块

二、依赖注入:控制「注入谁、是否必填」

装饰器作用典型场景
@Inject(token)token 明确指定要注入的 provider,token 可以是类或字符串同一个接口有多个实现时要指定注入哪一个;或注入字符串/符号 token 的 provider
@Optional()声明这个依赖是可选的,没有对应 provider 时注入 undefined,不报错某些配置或服务可能不存在,没有时逻辑走默认分支

三、路由与 HTTP 方法:声明「哪个路径、哪种请求」

装饰器作用典型场景
@Get()@Post()@Put()@Delete()@Patch()@Options()@Head()声明该方法处理对应的 HTTP 方法,可传路径如 @Get(':id')定义 REST 接口:查用 Get、增用 Post、改用 Put、删用 Delete 等

路径可以写在方法上,如 @Get('list'),最终路径 = 控制器前缀 + 方法路径(如 @Controller('user') + @Get('list')/user/list)。


四、取请求里的数据:参数从哪来

装饰器作用典型场景
@Param(key?)URL 路径参数,如 /user/:id 里的 id@Param('id') id: string,路径里带动态片段时用
@Query(key?)查询参数,如 /user?name=xx 里的 name@Query('name') name: string@Query() query: Record<string, string>
@Body()请求体,一般用 DTO class 接收,做校验和类型约束@Body() dto: CreateUserDto,Post/Put 的 JSON 或表单
@Headers(key?)请求头里某个字段或全部AuthorizationUser-Agent 或做简单网关/审计
@Session()session 对象(需配合 express-session 等中间件)传统 session 登录态、多步表单暂存等
@HostParam(key?)host 里的参数(子域名等)多租户按子域名区分时用,相对少见
@Req() / @Request()注入原生 request 对象需要拿到完整 req(如流、原始 body)时用,一般优先用上面几个专用装饰器
@Res() / @Response()注入原生 response 对象需要自己调 res.send()res.json() 时用;注意:一旦用了,Nest 默认不再把返回值当响应,除非用 @Res({ passthrough: true })
@Next()注入调用下一个 handlernext 方法多个 handler 串起来、或与中间件风格混用时用,一般较少

五、AOP 与元数据:Guard / Pipe / Filter / Interceptor / 自定义 metadata

装饰器作用典型场景
@UseGuards(Guard)在控制器或方法上使用守卫(鉴权、权限)某个接口要登录才访问:@UseGuards(LoginGuard)
@UseFilters(Filter)在控制器或方法上使用异常过滤器某几个接口想用自定义错误格式:@UseFilters(MyExceptionFilter)
@UsePipes(Pipe)在控制器或方法上使用管道(校验、转换参数)对某类接口统一做 DTO 校验或参数转换
@UseInterceptors(Interceptor)在控制器或方法上使用拦截器(日志、包装响应等)对某类接口统一计时、改返回结构
@Catch(Exception)声明该 ExceptionFilter 只处理哪一类异常@Catch(HttpException) 只处理 HTTP 异常,其它异常交给别的 Filter
@SetMetadata(key, value)在类或方法上挂自定义元数据,供 Guard 等读取角色权限:@SetMetadata('roles', ['admin']),Guard 里用 Reflector

六、控制响应:状态码、头、重定向、模板

装饰器作用典型场景
@HttpCode(code)指定本次响应的 HTTP 状态码如 Post 成功默认 201,想改成 200:@HttpCode(200)
@Header(name, value)设置响应头里某个字段@Header('Cache-Control', 'no-cache')、自定义头等
@Redirect(url, statusCode?)HTTP 重定向登录后跳转、旧 URL 迁到新地址
@Render(template)指定用服务端模板渲染视图(需配视图引擎)传统服务端渲染页面,返回 HTML

小结

  • 模块与类@Module@Controller@Injectable@Global 告诉 Nest 这是什么、怎么组织。
  • 依赖注入@Inject@Optional 控制「注入谁、是否必填」。
  • 路由与取参@Get/@Post 等定路径和方法;@Param@Query@Body@Headers@Req/@Res 从请求里拿数据。
  • AOP@UseGuards@UseFilters@UsePipes@UseInterceptors@Catch@SetMetadata 做鉴权、异常、参数处理和自定义元数据。
  • 响应@HttpCode@Header@Redirect@Render 控制状态码、头和重定向、模板。

用的时候先想「这是声明类、注入依赖、取参数、挂 AOP 还是改响应」,再对到上面对应块里的装饰器即可。

Loading Comments...