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

