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

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测试界面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:02:14