【问题标题】:share mqtt client object between files在文件之间共享 mqtt 客户端对象
【发布时间】:2019-04-02 20:04:18
【问题描述】:

我通过这种方式连接到 MQTT:

//mqtt.js

const mqtt = require('mqtt');

var options = {
    //needed options
};

var client = mqtt.connect('mqtt://someURL', options);

client.on('connect', () => {
    console.log('Connected to MQTT server');
});

我想以这种方式导出 client 对象:

//mqtt.js

module.exports = client;

这样我就可以将它导入其他文件并以这种方式使用它:

//anotherFile.js    

const client = require('./mqtt');
client.publish(...)

但是,我们都知道这是行不通的!我怎样才能做到这一点?

更新

我尝试了 promise 并得到了一个非常奇怪的行为。当我像下面的代码一样在同一个文件(mqtt.js)中使用承诺时,一切正常:

//mqtt.js
const mqtt = require('mqtt');

var mqttPromise = new Promise(function (resolve, reject) {

    var options = {
     //needed options
    };
    var client = mqtt.connect('mqtt://someURL', options);

    client.on('connect', () => {
        client.subscribe('#', (err) => {
            if (!err) {
                console.log('Connected to MQTT server');
                resolve(client);
            } else {
                console.log('Error: ' + err);
                reject(err);
            }
        });
    });
});


mqttPromise.then(function (client) {
    //do sth with client
}, function (err) {
    console.log('Error: ' + err);
});

但是当我导出承诺并在另一个文件中使用它时,像这样:

//mqtt.js

//same code to create the promise    
module.exports = mqttPromise;

//anotherFile.js

const mqttPromise = require('./mqtt');

mqttPromise.then(function (client) {
     //do sth with client
 }, function (err) {
    console.log('Error: ' + err);
 });

我收到此错误:

TypeError: mqttPromise.then 不是函数

【问题讨论】:

    标签: node.js export mqtt node-modules


    【解决方案1】:

    您可能可以创建 2 个文件来实现您的目标,一个用于处理 mqtt 方法,另一个用于管理连接对象。

    这是 mqtt 处理程序的文件:

        //mqttHandler.js       
    
        const mqtt = require('mqtt');
    
        class MqttHandler {
          constructor() {
            this.mqttClient = null;
            this.host = 'YOUR_HOST';
            this.username = 'YOUR_USER'; 
            this.password = 'YOUR_PASSWORD';
          }
    
          connect() {
    
            this.mqttClient = mqtt.connect(this.host, {port: 1883});
            // Mqtt error calback
            this.mqttClient.on('error', (err) => {
              console.log(err);
              this.mqttClient.end();
            });
    
            // Connection callback
            this.mqttClient.on('connect', () => {
              console.log(`mqtt client connected`);
            });
    
    
             this.mqttClient.on('close', () => {
               console.log(`mqtt client disconnected`);
             });
          }
    
        //   // Sends a mqtt message to topic: mytopic
          sendMessage(message, topic) {
    
                this.mqttClient.publish(topic, JSON.stringify(message));
    
          }
        }
    
        module.exports = MqttHandler;
    

    现在让我们使用导出的模块在另一个文件上创建一个 mqtt 客户端连接:

        //mqttClient.js
    
        var mqttHandler = require('./mqttHandler');
    
        var mqttClient = new mqttHandler();
    
        mqttClient.connect();
    
        module.exports = mqttClient;
    

    有了这个导出的模块,您现在可以调用您的客户端连接对象,并在另一个文件中使用 mqttHandler.js 文件中创建的方法:

        //main.js
        var mqttClient = require('./mqttClient');
    
        mqttClient.sendMessage('<your_topic>','<message>');
    

    虽然可能有更好的方法来执行您的任务,但这个方法对我来说效果很好......

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      cusMqtt.js

      const mqtt = require("mqtt");
      
      function prgMqtt() {
        const options = {
          port: 1883,
          host: "mqtt://xxxxxxx.com",
          clientId: "mqttjs_" + Math.random().toString(16).substr(2, 8),
          username: "xxxxxx",
          password: "xxxxxx",
          keepalive: 60,
          reconnectPeriod: 1000,
          protocolId: "MQIsdp",
          protocolVersion: 3,
          clean: true,
          encoding: "utf8",
        };
        prgMqtt.client = mqtt.connect("mqtt://xxxxxxxx.com", options);
      
        prgMqtt.client.on("connect", () => {
          prgMqtt.client.subscribe("Room/Fan");
          console.log("connected MQTT");
        });
      
        prgMqtt.client.on("message", (topic, message) => {
          console.log("message is " + message);
          console.log("topic is " + topic);
      
          // client.end();
        });
      }
      
      exports.prgMqtt = prgMqtt;
      

      index.js/主程序调用

      const { prgMqtt } = require("./startup/cusMqtt");
      
      prgMqtt();
      

      另一个.js

      const { prgMqtt } = require("../startup/cusMqtt");
      
      router.get("/:id", async (req, res) => {
        prgMqtt.client.publish("Room/Reply", "Replied Message");
      });
      

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 1970-01-01
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        相关资源
        最近更新 更多