Nest:常用 15 个装饰器知多少?

nest 很多功能基于装饰器实现,我们有必要好好了解下有哪些装饰器:

创建 nest 项目:

bash 复制代码
nest new all-decorator -p npm

@Module({})

这是一个类装饰器,用于定义一个模块。

模块是 Nest.js 中组织代码的单元,可以包含控制器、提供者等:

@Controller() 和 @Injectable()

这两个装饰器也是类装饰器,前者控制器负责处理传入的请求和返回响应,后者定义一个服务提供者,可以被注入到控制器或其他服务中。

通过 @Controller@Injectable 分别声明 controller 和 provider:

@Optional、@Inject

创建可选对象(无依赖注入),可以用 @Optional 声明一下,这样没有对应的 provider 也能正常创建这个对象。

注入依赖也可以用 @Inject 装饰器。

@Catch

filter 是处理抛出的未捕获异常,通过 @Catch 来指定处理的异常:

@UseXxx、@Query、@Param

使用 @UseFilters 应用 filter 到 handler 上:

除了 filter 之外,interceptor、guard、pipe 也是这样用:

@Body

如果是 post、put、patch** **请求,可以通过 @Body 取到 body 部分:

我们一般用 dto 定义的 class 来接收验证请求体里的参数。

@Put、@Delete、@Patch、@Options、@Head

@Put、@Delete、@Patch、@Options、@Head 装饰器分别接受 put、delete、patch、options、head 请求:

@SetMetadata

通过 @SetMetadata 指定 metadata,作用于 handler 或 class

然后在 guard 或者 interceptor 里取出来:

@Headers

可以通过 @Headers 装饰器取某个请求头或者全部请求头:

@Ip

通过 @Ip 拿到请求的 ip,通过 @Session 拿到 session 对象:

@HostParam

@HostParam 用于取域名部分的参数。

下面 host 需要满足 xxx.0.0.1 到这个 controller,host 里的参数就可以通过 @HostParam 取出来:

@Req、@Request、@Res、@Response

前面取的这些都是 request 里的属性,当然也可以直接注入 request 对象:

@Req 或者 @Request 装饰器,这俩是同一个东西。

使用 @Res 或 @Response 注入 response 对象,但是注入 response 对象之后,服务器会一直没有响应。

因为这时候 Nest 就不会把 handler 返回值作为响应内容了。我们可以自己返回响应:

Nest 这么设计是为了避免相互冲突。

如果你不会自己返回响应,可以设置 passthrough 为 true 告诉 Nest:

@Next

除了注入 @Res 不会返回响应外,注入 @Next 也不会。

当你有两个 handler 来处理同一个路由的时候,可以在第一个 handler 里注入 next,调用它来把请求转发到第二个 handler。

@HttpCode

handler 默认返回的是 200 的状态码,你可以通过 @HttpCode 修改它:

@Header

当然,你也可以修改 response header,通过 @Header 装饰器:

相关推荐
浏览器爱好者几秒前
如何在AWS上部署一个Web应用?
前端·云计算·aws
xiao-xiang17 分钟前
jenkins-通过api获取所有job及最新build信息
前端·servlet·jenkins
C语言魔术师33 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
Channing Lewis1 小时前
flask常见问答题
后端·python·flask
Channing Lewis1 小时前
如何保护 Flask API 的安全性?
后端·python·flask
匹马夕阳2 小时前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?2 小时前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
桂月二二8 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
Ai 编码助手9 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
小丁爱养花9 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring