使用CloudMQTT进行Node JS实时文本更新

Node JS live text update with CloudMQTT

本文关键字:实时 文本 更新 JS Node CloudMQTT 进行 使用      更新时间:2023-09-26

我有一个节点服务器连接到CloudMQTT并在app.js中接收消息。我有我的客户端web应用程序在同一节点服务器上运行,并希望在.ejs文件的其他地方显示我在app.js中收到的消息,我正在努力如何最好地做到这一点。

app.js
// Create a MQTT Client
var mqtt = require('mqtt');
// Create a client connection to CloudMQTT for live data
var client = mqtt.connect('xxxxxxxxxxx', {
  username: 'xxxxx',
  password: 'xxxxxxx' 
});
client.on('connect', function() { // When connected
    console.log("Connected to CloudMQTT");
  // Subscribe to the temperature
  client.subscribe('Motion', function() {
    // When a message arrives, do something with it
    client.on('message', function(topic, message, packet) {
      // ** Need to pass message out **
    });
  });
});

基本上,您需要一种方法让客户端(带有EJS - HTML、CSS和JS的浏览器代码)接收实时更新。从客户机到节点服务基本上有两种方法:

  1. 客户端实例化的websocket会话

  2. 轮询方法

有什么区别?

在底层,websocket是全双工通信机制。这意味着您可以打开从客户机(浏览器)到节点服务器的套接字,并且它们可以在长时间的会话中以两种方式相互通信。优点是更新通常是即时的,而不必像轮询那样产生另一个HTTP请求的成本。缺点是它使用的套接字连接可能是长期存在的,而且任何服务器上通常都有一个套接字池,处理许多套接字的能力有限。有很多方法可以解决这个问题,但如果你很关心这个问题,你可能想要使用轮询。

轮询是你在服务器上设置一个端点的地方,客户端JS代码会不时地访问这个端点。该端点将返回更新后的信息。缺点是,你现在正在发出一个新的请求,以获得更新,这可能是不可取的,如果大量的更新预期通过,应用程序被期望以最及时的方式更新(大多数时间轮询是足够的)。好处是,您不需要在服务器上无限期地打开一个实时连接。

同样,有更多的优点和缺点,这些只是显而易见的。你决定如何实现它。当客户端从这些机制接收到数据时,您可以以任何合适的方式更新UI。

在服务器端,您需要一种方法来持久化来自CloudMQTT的信息。有多种方法可以做到这一点。如果你不关心内存消耗,并且可以在客户端暂时不需要旧数据的情况下丢弃旧数据,那么将其存储在常规javascript对象{}的内存中可能是可以的。如果你确实关心在服务器重启/崩溃之间持久化数据(可能是最好的),那么你可以持久化到像Redis, Mongo这样的东西,如果你的数据本质上是关系型的,甚至是磁盘上的常规JSON文件(见fs.writeFile)。

希望这能帮助你朝着正确的方向迈出一步!