share mqtt client object between files

2019-07-12 22:42发布

I connect to MQTT this way:

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

I want to export the client object this way:

//mqtt.js

module.exports = client;

So that I can import it in other files and make use of it this way:

//anotherFile.js    

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

However, we all know that this will not work! How can I achieve this ?

Update

I tried promise and get a very strange behavior. When I use the promise in the same file (mqtt.js) like the code below, everything is OK:

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

But when I export the promise and use it in another file, like this:

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

I get this error:

TypeError: mqttPromise.then is not a function

1条回答
淡お忘
2楼-- · 2019-07-12 23:02

You can probably achieve your goal creating 2 files, one for handling mqtt methods and another to manage the connection object.

Here's the file for the mqtt handler:

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

Now lets use the exported module to create a mqtt client connection on another file:

    //mqttClient.js

    var mqttHandler = require('./mqttHandler');

    var mqttClient = new mqttHandler();

    mqttClient.connect();

    module.exports = mqttClient;

With this exported module you can now call your client connection object and use the methods created in the mqttHandler.js file in another file :

    //main.js
    var mqttClient = require('./mqttClient');

    mqttClient.sendMessage('<your_topic>','<message>');

Although there may be a better method to perform your task, this one worked pretty well for me...

Hope it helps!

查看更多
登录 后发表回答