Express 将mqtt订阅绑定到节点EJ和状态

Express 将mqtt订阅绑定到节点EJ和状态,express,mqtt,Express,Mqtt,旧的Rails和php程序员,对js来说是新的,提了一些东西,觉得我缺少了一些非常基本的东西。我有一个运行小型webapp、express、ejs、jquery以及alpinejs的节点服务器。(非常熟悉jquery,但学习alpinejs)。我有一个运行的mqtt服务器,可以通过手机操作几个主题,甚至可以在节点控制台中看到它们(下面的代码) 我不理解的是如何获取,或者可能“绑定”订阅到一个变量,我可以“传递”到express应用程序中,这样我就可以在html中显示mqtt消息。我现在正在尝试设

旧的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文件不知道
需要mqtt

您不能将on消息处理程序移动到ejs文件中,因为它们仅在调用
render()时“执行”

您可以在ExpressJS应用程序中声明一个全局变量,并从('message',…)
回调中更新其中的字段,然后将此变量传递到对
render()
的调用中,但这意味着页面将仅显示加载页面时的值


如果您希望在消息发布时在页面中进行实时更新,那么您有一个真正的选择。也就是说,使用支持WebSocket上的MQTT的代理(几乎所有现代代理都支持这一点)。这样,您可以将MQTT客户机(客户机或您可以使用客户机)加载到页面中,并直接从页面订阅您感兴趣的主题。通过这种方式,新消息将直接传递到页面,然后您可以使用您想要更新页面的任何JavaScript框架。

只需使用MQTT over WebSocket和Paho JavaScript客户端,将MQTT客户端从服务器端移动到浏览器即可。谢谢。这正是我需要知道的,也是我要走的方向。我现在有一个几乎可行的想法。。。我在蚊子服务器上安装了WebSocket,并在每个“页面”上给Paho打电话。现在只需要将传入消息绑定到alpinejs变量,但这是一个完全不同的问题。谢谢