Nest:使用 ArgumentHost 和 ExecutionContext 统一处理多种服务类型

Nest.js 的设计允许开发者使用统一的方式处理不同类型的服务,如 HTTP、WebSocket 和基于 TCP 的微服务。

这是通过 ArgumentHostExecutionContext 类实现的,它们提供了跨多种上下文(context)复用 Guards、Interceptors 和 Exception Filters 的能力。

ExecutionContext 类

ExecutionContext 类是一个扩展了 ArgumentsHost 的类。提供了更多关于当前执行过程的信息,比如当前的处理器、类和方法。

ArgumentHost 类

ArgumentHost 是一个包装了当前执行上下文的参数的对象。

我们可以使用 switchToHttp()switchToWs()switchToRpc() 方法来获取特定 HTTP、WebSocket 或 RPC 的上下文信息。
ArgumentHostExecutionContext 的一个超集,它专门用于异常过滤器中。

Exception Filters

创建项目试试:

bash 复制代码
nest new argument-host -p npm

然后创建一个 filter:

bash 复制代码
nest g filter HttpException --flat --no-spec


@Catch() 没有声明参数。表示会 catch 所有类型的异常。

如何声明 Exception Filter 来捕获特定类型的异常呢?

catch 一下 HttpException 异常。

AppModule 全局启用下:

AppController 抛出对应错误:

访问 http://localhost:3000

filter 的第一个参数是异常对象,第二个参数是什么呢?

可以看到,它有这些方法。

host.getType 方法取出当前所处上下文。

host.getArgs 方法就是取出当前上下文的 reqeust、response、next 参数。

调用 host.switchToHttp、host.swtichToWs、host.switchToRpc 方法可以分别切换 http、ws、基于 tcp 的微服务上下文。

这样,就可以在 filter 里处理多个上下文的逻辑了:

访问页面:

guard 那 guard 和 interceptor 里如何使用 context 呢?

创建个 guard:

bash 复制代码
nest g guard role --no-spec --flat

ExecutionContext 扩展了 getClass、getHandler 方法。

这样 Guard、Interceptor 的逻辑可根据目标 class、handler 有没有某些装饰而决定怎么处理。

比如权限验证的时候,我们会先定义几个角色:

自定义装饰器添加 Metadata:

然后在 handler 上添加这个装饰器,参数为 admin:

这样在 Guard 里就可以根据这个 metadata 决定是否放行了:

这里注入的 reflector,并不需要在模块的 provider 声明。

查看页面返回 "Forbidden resource",说明 Guard 生效了,因为 user 是 undefined:

interceptor

在 interceptor 里也有这个 context:

bash 复制代码
nest g interceptor aaa --no-spec --flat

同样可以通过 reflector 取出 class 或者 handler 上的 metdadata。

相关推荐
lichenyang4533 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen3 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒3 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
奇奇怪怪的4 小时前
Embedding 模型 10+ 横向评测
前端
陈广亮4 小时前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰4 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程
敲代码的鱼4 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
子兮曰4 小时前
前端工具链的「Rust 化」:一场没有赢家的军备竞赛?
前端·后端·rust
Hyyy5 小时前
Function Calling / Tool Use的原理和实现模式
前端·llm·ai编程
爱勇宝5 小时前
从 Ctrl+CV 到 Enter:程序员正在失去什么
前端·后端·程序员