舊的Rails和php程序員,對js來說是新的,我覺得我缺少了一些基本的東西。我有一個運行小型webapp、express、ejs、jquery和alpinejs的節點服務器。(非常熟悉jquery,但是學習alpinejs)。我有一個運行的mqtt服務器,可以通過手機操作幾個主題,甚至可以在節點控制臺中看到它們(下面的代碼)
我不明白的是如何獲取,或者“綁定”訂閱一個變量,我可以“傳遞”到express應用程序中,這樣我就可以在html中顯示mqtt消息。我現在正在嘗試設置fridgeFan = true
之類的東西。我認為,我的想法是讓mqtt更新alpinejs變量,從而更新頁面,反之亦然。。。
有人能給我指出我要做的事情的大致方向嗎?
options={
clientId:"node-admin",
clean:true,
};
const express = require('express');
const app = express();
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://192.168.10.66', options)
client.on("connect",function(){
console.log("connected");
});
client.on('message',function(topic, message, packet){
console.log("message is "+ message);
console.log("topic is "+ topic);
// assume id like to bind topic and message to
// some variable that I can pass or have access to
// in the res.render calls below??
// couple of things I was trying
//document.getElementById('mqtt_div').innerHTML += topic;
//document.querySelector('[x-data]').__x.getUnobservedData().fridgeFan = message;
});
client.subscribe("sensors/sensor1",{qos:1});
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/public'));
app.get('/', (req, res) => {
res.render('index', {
title: 'Homepage'
});
});
通過上面的代碼,我可以通過手機應用程序發布到“sensors/sensor1”,我可以在節點控制臺看到它,當然不是瀏覽器控制臺。
如何將“message”綁定到alpinejs變量以使其更新?
或者我應該換個方向把client.on調用放在別處,比如ejs文件?在我的測試中,ejs文件不知道require mqtt
不能將on消息處理程序移到EJS文件中,因為它們只在調用
render()
時“執行”您可以在ExpressJS應用程序中聲明一個全局變量,并通過
on('message',...)
回調更新其中的字段,然后將此變量傳遞到對render()
的調用中,但這意味著頁面將只顯示加載頁面時的值。如果您希望在消息發布時在頁面中實時更新,那么您有一個真正的選擇。也就是說,使用支持Websockets上的MQTT的代理(幾乎所有現代代理都支持這一點)。有了它,您可以將MQTT客戶機(pahojavascript客戶機或使用MQTT.js客戶機)加載到頁面中,并直接從頁面訂閱您感興趣的主題。通過這種方式,新消息被直接傳遞到頁面,然后您可以使用您想要更新頁面的任何JavaScript框架。