NestJs中微服务间传递Header且不修改Payload的实现方法
在NestJS微服务间传递自定义Header(不修改Payload)
正确传递Header的方式
你之前的代码中使用了context字段,但NestJS微服务的send/emit方法需要通过metadata字段来传递自定义Header,无需修改请求Payload。调整后的代码如下:
// 发送端send方法示例 return await this.Client.send(MICRO_SERVICE_PATTERN, data, { metadata: { headers: responseHeaders }, }).toPromise(); // 发送端emit方法示例 this.Client.emit(MICRO_SERVICE_PATTERN, data, { metadata: { headers: responseHeaders }, });
在目标微服务中获取Header
在目标微服务的消息处理函数中,通过RpcArgumentsHost获取传递的metadata,进而提取Header:
// 目标微服务控制器 import { MessagePattern, RpcArgumentsHost, EventPattern } from '@nestjs/microservices'; // 处理send请求 @MessagePattern(MICRO_SERVICE_PATTERN) async handleRequest(data: any, host: RpcArgumentsHost) { const metadata = host.getContext(); const receivedHeaders = metadata.headers; // 执行业务逻辑 return { originalPayload: data, receivedHeaders: receivedHeaders }; } // 处理emit事件 @EventPattern(MICRO_SERVICE_PATTERN) async handleEvent(data: any, host: RpcArgumentsHost) { const metadata = host.getContext(); const receivedHeaders = metadata.headers; // 执行事件处理逻辑 }
注意事项
- 不同传输协议(TCP、Kafka、HTTP等)的上下文结构可能略有差异,但
metadata的传递方式是统一的。 - 如果使用HTTP作为微服务传输层,也可以直接使用
@Headers()装饰器获取Header,但通过RpcArgumentsHost的方式适配更多传输协议。
内容的提问来源于stack exchange,提问作者Dilpesh
相关产品推荐
相关产品推荐

