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

使用Mosca搭建MQTT服务器时JSON解析报错的解决方法咨询

解决Mosca MQTT消息JSON解析错误的问题

看起来你遇到的SyntaxError是因为拿到的payload字符串并非有效的JSON格式,咱们一步步来排查和解决:

第一步:先搞清楚你拿到的到底是什么内容

错误提示说在位置2有意外的字符c,说明转换后的payloadString根本不是你预期的JSON。先在代码里添加调试打印,看看原始payload的真实模样:

server.on('published', (packet, client) => {
  let { payload } = packet;
  if(payload) {
    console.log('原始payload类型:', typeof payload);
    console.log('原始payload值:', payload);
    let payloadString = payload.toString();
    console.log('转换后的字符串:', payloadString); // 重点看这个输出
    try {
      let payloadJson = JSON.parse(payloadString);
      console.log(payloadJson);
    } catch (err) {
      console.error('解析错误详情:', err);
    }
  }
});

运行后你就能看到到底是什么字符串导致了解析失败——大概率是以下几种情况之一:

常见问题和对应解决办法

1. Payload是Buffer但编码转换不明确

Mosca的packet.payload是Buffer类型,默认toString()用的是utf8编码,但如果发送端用了其他编码,或者消息有隐藏字符,就会出问题。

解决办法:明确指定utf8编码,同时去掉字符串前后的空白字符:

payloadString = packet.payload.toString('utf8').trim();

2. 收到了Mosca的系统消息

Mosca的published回调会收到所有消息,包括系统级的消息(比如订阅确认、$SYS开头的主题消息),这些消息的payload往往不是业务JSON,甚至是空的。

解决办法:先过滤掉这些非业务消息:

server.on('published', (packet, client) => {
  // 过滤空payload和系统主题消息
  if (!packet.payload || packet.topic.startsWith('$SYS/')) {
    return;
  }
  
  try {
    let payloadString = packet.payload.toString('utf8').trim();
    let payloadJson = JSON.parse(payloadString);
    console.log('解析成功:', payloadJson);
    // 这里执行存入数据库的逻辑
  } catch (err) {
    console.error('JSON解析失败:', err.message);
    console.error('出错的消息内容:', payloadString);
  }
});

3. 发送端的消息本身就不是标准JSON

比如发送端没有正确用JSON.stringify()把对象转为字符串,或者消息里有语法错误(比如引号不匹配、逗号多余)。

解决办法:检查发送端代码,确保发送的是经过JSON序列化的字符串,而不是直接发送JS对象。比如发送端应该是:

// 正确示例:先序列化再发送
const message = {_id:"5e928105156c40000006f9e9", temperature:33, humidity:64.9};
client.publish('your/topic', JSON.stringify(message));

最后提醒

用try-catch包裹JSON解析逻辑是个好习惯,这样即使遇到错误消息,也不会导致整个MQTT服务崩溃,还能打印出错误详情方便调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:12:35