使用CloudMQTT节点JS实时文本更新

我有一个连接到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请求的成本。 这意味着它使用的socket连接可能是长期存在的,并且在任何服务器上通常都有一个套接字池,这个套接字池处理多个套接字的能力有限。 在这个问题上有很多方法可以扩展,但是如果你担心这个问题的话,你可能需要进行轮询。

轮询是您在您的服务器上设置客户端JS代码时不时碰到的端点。 该端点将返回您更新的信息。 可能的原因是,您现在正在提出一个新的请求以获取更新,如果预计会有大量更新,应用程序可能会尽快更新(大部分时间虽然投票是足够的)。 亲是你无法在服务器上打开一个活连接无限期。

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

从服务器端,您将需要一种方法来保存来自CloudMQTT的信息。 有多种方法可以做到这一点。 如果你不关心内存消耗,并且可能丢掉旧数据,如果客户端暂时没有要求,那么也可以把它存储在内存中的一个正常的JavaScript对象。 如果你关心在服务器重启/崩溃之间保持数据(可能是最好的),那么你可以坚持像Redis , Mongo ,任何SQL存储,如果你的数据是关系性的,甚至是磁盘上的常规JSON文件(请参阅fs.writeFile )。

希望这有助于你朝正确的方向迈出一步!