在文件之间共享mqtt客户端对象

时间:2018-10-29 20:13:54

标签: node.js export mqtt node-modules

我通过以下方式连接到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)中使用promise时,一切正常:

//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);
});

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

//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。那不是函数

2 个答案:

答案 0 :(得分:0)

创建两个文件可能会实现您的目标,一个文件用于处理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>');

尽管可能有更好的方法来执行任务,但这种方法对我来说效果很好...

希望有帮助!

答案 1 :(得分:0)

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");
});