mqtt.js | client.connected returns false 虽然客户端似乎已连接

mqtt.js | client.connected returns false though client seems to be connected

在玩弄 node.js 的 mqtt.js 时,我发现 client.connected 的值似乎是错误的,或者我误解了一些东西。
我完成了本教程 http://thejackalofjavascript.com/getting-started-mqtt/,一切正常。

我试图更多地了解 mqtt,所以我查看了 https://www.npmjs.com/package/mqtt#mqttclientconnected , client.connected 的描述:

Boolean : set to true if the client is connected. false otherwise.


为了看看它是否有效,我修改了第一行的源代码,就像这样

var mqtt = require('mqtt')

client = mqtt.connect('mqtt://localhost');

  if (client.connected == true) {
        console.log("Connection successful.")
    }
    else{
        console.log("Something went wrong.")
    }

client.subscribe('presence');

console.log('Client publishing.. ');
client.publish('presence', 'Client 1 is alive.. Test Ping! ' + Date());

client.end();

我刚刚添加了 if 子句。执行脚本时,我总是收到消息,说出了点问题,ergo: connected --> false。
但是为什么?

问题是 mqtt.connect() 调用是异步的。所以它 returns 在它实际连接之前。这意味着当您在调用 mqtt.connect() 后直接测试 mqtt.connected 它仍然是错误的,因为它实际上还没有完成连接。

您需要注册事件处理程序,以便在客户端实际连接时得到通知。

var mqtt = require('mqtt')

var client = mqtt.connect('mqtt://localhost');

client.on('connected',function(){
  client.subscribe('presence');
  console.log('Client publishing.. ');
  client.publish('presence', 'Client 1 is alive.. Test Ping! ' + Date());
});

client.on('message',function(topic,message){
  console.log("received message on " + topic);
  console.log(message.toString());
  client.end();
});

此代码连接到代理,订阅主题 presence,然后向同一主题发布消息。当它收到关于 presence 主题的消息时,它会打印出来然后退出。