首页 > 解决方案 > 如何在类模块外导出变量

问题描述

我发现这个例子在 node.js 中像一个类一样使用 mqtt:

mqtt_handler.js:

const mqtt = require('mqtt');

class MqttHandler {
  constructor() {
    this.mqttClient = null;
    this.host = 'YOUR_HOST';
    this.username = 'YOUR_USER'; // mqtt credentials if these are needed to connect
    this.password = 'YOUR_PASSWORD';
  }
  
  connect() {
    // Connect mqtt with credentials (in case of needed, otherwise we can omit 2nd param)
    this.mqttClient = mqtt.connect(this.host, { username: this.username, password: this.password });

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

    // mqtt subscriptions
    this.mqttClient.subscribe('mytopic', {qos: 0});

    // When a message arrives, console.log it
    this.mqttClient.on('message', function (topic, message) {
      console.log(message.toString());
    });

    this.mqttClient.on('close', () => {
      console.log(`mqtt client disconnected`);
    });
  }

  // Sends a mqtt message to topic: mytopic
  sendMessage(message) {
    this.mqttClient.publish('mytopic', message);
  }
}

module.exports = MqttHandler;

然后,在 app.js 中:

var express = require("express");
var bodyParser = require("body-parser");
var app = express();
var mqttHandler = require('./mqtt_handler.js');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }))

var mqttClient = new mqttHandler();
mqttClient.connect();

// Routes
app.post("/send-mqtt", function(req, res) {
  mqttClient.sendMessage(req.body.message);
  res.status(200).send("Message sent to mqtt");
});

var server = app.listen(3000, function () {
    console.log("app running on port.", server.address().port);
});

工作正常,其他文件中编写的 mqtt 代码可以帮助我编写更整洁的代码。

我需要能够直接在 app.js 中使用传入消息,因为那样我就必须使用 socket.io 处理它们,但我想将 mqtt 相关代码与 app.js 分开。但我找不到将传入消息值直接导出到 app.js 的方法。

this.mqttClient.on('message', function (topic, message) {
      console.log(message.toString());
    });

标签: javascriptnode.jsexpressmqtt

解决方案


推荐阅读