簡體   English   中英

Node.js 的 MQTT 客戶端在處理程序外部但不在內部功能

[英]MQTT client for Node.js functions outside the handler but not inside

我正在嘗試按照提供程序架構 model 實現一系列傳輸提供程序。 因此,我創建了一個抽象傳輸提供程序,然后由特定提供程序擴展,例如 mqtt、nats 等。但是,我在初始化 mqtt 客戶端時遇到了麻煩。 用於初始化、連接到客戶端然后與客戶端交互的代碼,當放在處理程序之外時,可以正常運行。 但是,提供程序方法 connect() 中的完全相同的代碼不會像預期的那樣 function (它似乎在使用調試器觀看時初始化客戶端,然后跳過所有 client.on 函數)。

這是抽象提供者,它簡單地概述了需要使用的方法:

class abTransProvider {

    constructor() {

        this.client;
        this.host;
        this.username = "guest";
        this.password = "guest";

        if (this.constructor == abTransProvider) {
            throw new Error("Abstract classes cannot be instantiated.");
        };
    };

    init() {
        throw new Error("Abstract method is not implemented");
    };

    connect(host) {
        throw new Error("Abstract method is not implemented");
    };



};

module.exports = {
    abTransProvider: abTransProvider
};

這是mqtt 處理程序本身的代碼。 請注意,這只是一個基本框架,因為我現在只測試連接方法(其中只有連接和錯誤的返回值):

const mqtt = require("mqtt");
const abTransProvider = require("../abTransProvider.js");

class specProvider extends abTransProvider.abTransProvider {
  
init() {

  }

  connect() {
    this.host = "mqtt://localhost:1883";
   
    this.client = mqtt.connect(this.host, {
      username: this.username,
      password: this.password,
    });

    // Mqtt error callback
    this.client.on("error", (err) => {
      console.log(err);
      this.client.end();
      return 1;
    });

    // Connection callback
    this.client.on("connect", () => {
      console.log(`MQTT client connected`);
      return 0;
    });

    // MQTT subscriptions
    this.client.subscribe("value", { qos: 0 });

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

    this.client.on("close", () => {
      console.log(`MQTT client disconnected`);
    });
  }
}

module.exports = {
    specProvider: specProvider,
  };

這是一個調用 connect 方法的簡單測試程序:

const trProv = require("mqtt.js");
const transport = new trProv.specProvider();

const trCheck = transport.connect();

if (trCheck !== 0) {
    console.log("Error when connecting to the provider")
    process.exit(1)
} else {
    console.log("Connection successful")
}

當測試程序調用 mqtt 處理程序方法 connect() 時,它似乎實例化了客戶端,但連接標志為 false。 但是,程序不會記錄錯誤(如果有錯誤),而是簡單地跳過 client.on 函數,因此返回值是未定義的。 我非常感謝任何有關如何解決此問題的反饋/意見/建議! 謝謝!

這段代碼真的沒有做你認為的事情。

所有返回語句都在您傳遞給事件處理程序的 lambda 函數中,因此它們對connect()方法沒有影響。 他們只是設置了 lambda 的返回值(將被忽略,因為事件回調不返回任何內容)。

結果connect()結束時沒有返回任何內容,因此undrfinded

這里最好的選擇可能是讓connect()返回一個 promise 可以在on('connected',...)處理程序中解決或在on('error',...)處理程序中拒絕(但錯誤可以稍后再打電話,所以你需要小心)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM