[英]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.