You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NestJS事件监听器中用拦截器获取消息内容?

使用@EventPattern时通过拦截器获取消息内容的方法

问题描述

当使用@EventPattern注解的方法接收事件时,如何通过拦截器获取消息内容?现有代码示例如下:

监听器代码

@EventPattern(PUB_SUB_SUBSCRIPTION_NAME)
@UseInterceptors(MyCustomInterceptor)
async processMessage(receivedMessage: Message): Promise<void> {}

拦截器代码

intercept(
    context: ExecutionContext,
    next: CallHandler<any>,
): Observable<any> | Promise<Observable<any>> {
    const { data } = context.switchToHttp().getRequest().body as Message;
}

疑问:context.switchToHttp().getRequest().body是否能获取消息内容?因为该请求并非HTTP请求。

解决方案

不能用context.switchToHttp(),因为@EventPattern属于消息驱动的RPC上下文,不是HTTP请求上下文。正确的做法是通过context.switchToRpc()来获取消息内容:

修正后的拦截器代码

intercept(
    context: ExecutionContext,
    next: CallHandler<any>,
): Observable<any> | Promise<Observable<any>> {
    // 获取监听器方法的参数数组,第一个元素就是传入的Message对象
    const [receivedMessage] = context.switchToRpc().getArguments();
    const messageContent = receivedMessage.data;
    // 可在此处对消息内容进行自定义处理
    return next.handle();
}

关键说明

  • @EventPattern是NestJS中处理Pub/Sub、消息队列等事件的注解,对应的上下文是RPC类型,而非HTTP。
  • context.switchToRpc().getArguments()返回监听器方法的所有参数,其中第一个参数就是传递过来的Message实例,直接从中提取data即可获取消息内容。

内容的提问来源于stack exchange,提问作者Rafa Acioly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:44:57