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

如何在NestJS中通过MQTT发送无引号的原始数据负载

解决NestJS MQTT客户端发送负载自动添加引号的问题

问题分析

你配置了自定义序列化器,但发送的字符串负载仍被自动添加双引号,原因是当前序列化逻辑返回的字符串可能被底层MQTT客户端或NestJS默认处理流程再次JSON序列化,导致字符串被引号包裹。

解决方案

1. 修改序列化器,直接返回原始Buffer或字符串

调整MQTT客户端配置中的序列化器,确保返回无需二次处理的原始负载:

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'MQTT_CLIENT',
        transport: Transport.MQTT,
        options: {
          url: 'mqtt://XX.XXX.XXX.XXX:1883',
          clientId: 'my-client-id',
          serializer: {
            serialize: (value: any) => {
              // 提取原始数据,支持直接传字符串或带data属性的对象
              const rawPayload = typeof value === 'string' ? value : value.data;
              // 转成Buffer避免被自动JSON序列化
              return Buffer.from(rawPayload);
            },
          },
        },
      },
    ]),
    ConfigModule.forRoot(),
  ],
  controllers: [AppController],
})
export class AppModule {}

2. 规范消息发送方式

使用@ClientProxy发送消息时,确保参数匹配序列化器逻辑:

  • 直接发送原始字符串:
    import { Inject, Injectable } from '@nestjs/common';
    import { ClientProxy } from '@nestjs/microservices';
    
    @Injectable()
    export class AppService {
      constructor(@Inject('MQTT_CLIENT') private readonly mqttClient: ClientProxy) {}
    
      sendRawData() {
        const payload = 'ti=0F:0000000000&id=E8EB1BE99345';
        this.mqttClient.publish('your-topic', payload).subscribe();
      }
    }
    
  • 传递带data属性的对象:
    this.mqttClient.publish('your-topic', { data: payload }).subscribe();
    

3. 禁用默认JSON序列化

若上述方法无效,可强制关闭底层mqtt.js客户端的默认JSON序列化:

options: {
  url: 'mqtt://XX.XXX.XXX.XXX:1883',
  clientId: 'my-client-id',
  protocolVersion: 4,
  serializer: {
    serialize: (value: any) => typeof value === 'string' ? value : value.data,
  },
}

验证

发送消息后,用MQTT监控工具(如MQTTX)检查负载,确认双引号已移除,原始字符串直接发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:05:24