делить клиентский объект mqtt между файлами - PullRequest
0 голосов
/ 29 октября 2018

Я подключаюсь к 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(...)

Однако мы все знаем, что это не сработает! Как мне этого добиться?

Обновление

Я пытался обещать и получал очень странное поведение. Когда я использую обещание в том же файле (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 не является функцией

1 Ответ

0 голосов
/ 03 апреля 2019

Вы, вероятно, можете достичь своей цели, создав 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>');

Несмотря на то, что может быть лучший метод для выполнения вашей задачи, этот метод мне очень помог ...

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...