如何在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
相关产品推荐
相关产品推荐

