【问题标题】:Problems with converting buffer to JS object将缓冲区转换为 JS 对象的问题
【发布时间】:2016-02-09 08:52:49
【问题描述】:

我将 mosca 库用于 MQTT 代理,this 用于 MQTT 客户端。

客户端代码如下所示:

client.on('connect', function () {
client.subscribe('presence')
var json = {
  someVar: 888,
  someNum: 234 
}
client.publish('presence', JSON.stringify(json));
});

client.on('message', function (topic, message) {
  var json = JSON.parse(message.toString())
  console.log(json.someVar);
  client.end();
});

处理每条已发布消息的代理在这里:

server.on('published', function(packet, client) {
  console.log('Package received:')
  console.log('Published', packet);

  var stringBuf = packet.payload.toString('utf-8')
  console.log('buffer to string:', stringBuf)
  var stringify = JSON.stringify(packet.payload)
  console.log('stringify:',stringify);
  var json = JSON.parse(stringily);
}

buffer to string: 的输出如下所示: {"someVar":888,"someNum":234} 哪个应该是有效的 json。但是每当我尝试访问 json 对象时(在使用 JSON.parse() 之后)它只会返回未定义的变量。

我也试过了

var buf = json.data;
console.log('buffer data:', but);

但这只是返回一个缓冲区数组,似乎也无法转换。

在客户端函数中,我可以轻松地将字符串解析为 JS 对象,所以我对正在发生的事情有点迷茫。

有什么建议吗?谢谢。

【问题讨论】:

  • 你为什么要这么做var stringify = JSON.stringify(packet.payload)?只要JSON.parse(stringBuf),你就会拥有你的对象。
  • 当我这样做时,我得到SyntaxError: Unexpected token m

标签: javascript json node.js mqtt


【解决方案1】:

就像 stdob-- 所说,您正在尝试解析所有传入的消息,您的示例的输出示例:

Package received:
Published mqttjs_05cac308
Package received:
Published {"clientId":"mqttjs_05cac308","topic":"presence"}
Package received:
Published <Buffer 7b 22 73 6f 6d 65 56 61 72 22 3a 38 38 38 2c 22 73 6f 6d 65 4e 75 6d 22 3a 32 33 34 7d>
Package received:
Published {"clientId":"mqttjs_05cac308","topic":"presence"}
Package received:
Published mqttjs_05cac308

您可以检查主题以处理您需要的presence消息:

server.on('published', function (packet, client) {
    if (packet.topic == 'presence') {
        var stringBuf = packet.payload.toString('utf-8');
        var obj = JSON.parse(stringBuf);
        console.log(obj);
    }
});
/* output: { someVar: 888, someNum: 234 } */

【讨论】:

    【解决方案2】:

    您收到错误消息是因为尝试解析所有传入消息,包括不包含纯 JSON 数据的服务消息。试试这个:

    server.on('published', function(packet, client) {
      console.log('Package received:')
      console.log('Published', packet);
    
      var stringBuf = packet.payload.toString('utf-8')
      try {
        var json = JSON.parse(stringBuf);
        console.log( json );
      } catch (e) {
        console.log( stringBuf );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 2019-03-21
      • 2022-08-05
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2018-09-18
      相关资源
      最近更新 更多