NestJS TCP微服务用Packet Sender测试无返回,求排查原因
问题描述
我按照官方文档实现了一个NestJS TCP微服务,测试时遇到问题。通过谷歌找到Packet Sender工具,测试发现请求能正常到达服务(控制台有请求日志输出),但无法在Packet Sender中接收到ASCII格式的返回结果。请问我哪里遗漏了配置?
相关代码
main.ts
async function bootstrap() { const config = new ConfigService().get(); const app = await NestFactory.createMicroservice(MainModule, { transport: config.authMS.transport, options: { host: config.authMS.options.host, port: Number(config.authMS.options.port), }, } as TcpOptions); await app.listen(); } bootstrap();
main.module.ts
@Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), TypeOrmModule.forRoot(configMainModulesService.getTypeOrmConfig()), AuthModule, ], }) export class MainModule {}
auth.controller.ts
@MessagePattern('getUser') async user(data: { login: string; token: string }): Promise<any> { const res = await this.authService.getUser(data); console.log('ress =>', res); return res; }
auth.service.ts
public async getUser(data: any): Promise<any> { const tokenExists = await this.authRepository.findOne({ where: { token: data.token }, }); if (tokenExists) { const user = await this.authRepository.findOne({ where: { login: data.login }, }); if (!user) { return { status: HttpStatus.NOT_FOUND, message: 'user_search_by_credentials_not_found', user: null, }; } return { status: HttpStatus.OK, message: 'user_search_by_credentials_success', user: this.toPublicUser(user), }; } else { return { status: HttpStatus.BAD_REQUEST, message: 'user_search_by_credentials_token_invalid', user: null, }; } }
测试截图
Packet Sender测试界面

控制台请求日志

解决方案
问题出在NestJS TCP微服务默认的序列化协议上。NestJS的TCP传输默认使用MessagePack序列化数据,这是一种二进制协议,而非纯ASCII/JSON格式,Packet Sender无法自动解析这种二进制数据,所以你看不到可读的ASCII返回结果。
有两种解决方式:
1. 切换为JSON序列化器
在创建微服务时,配置options中的serializer和deserializer为NestJS提供的JSON序列化/反序列化器,让数据以JSON(ASCII格式)传输:
import { JsonSerializer, JsonDeserializer } from '@nestjs/microservices'; async function bootstrap() { const config = new ConfigService().get(); const app = await NestFactory.createMicroservice(MainModule, { transport: config.authMS.transport, options: { host: config.authMS.options.host, port: Number(config.authMS.options.port), serializer: new JsonSerializer(), deserializer: new JsonDeserializer(), }, } as TcpOptions); await app.listen(); } bootstrap();
2. 在Packet Sender中适配MessagePack解析
如果要保留默认的MessagePack协议(适合对性能有要求的场景),需要在Packet Sender中设置返回结果的解析格式为MessagePack,同时发送请求时也要将数据序列化为MessagePack二进制格式。不过这种方式不如JSON直观,调试成本更高。
另外注意:切换为JSON序列化器后,Packet Sender发送请求时要发送标准的JSON字符串,确保格式和服务端接收的参数结构匹配。
内容的提问来源于stack exchange,提问作者Guilherme Gonzalez
相关产品推荐
相关产品推荐

