我有一个 Node 服务器,它连接到 CloudMQTT 并在 app.js 中接收消息。我的客户端 Web 应用程序在同一 Node 服务器上运行,并且希望在 .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 的浏览器代码)接收实时更新的方法。从客户端到 Node 服务基本上有两种方法:
有什么区别?
在底层,Websocket 是全双工通信机制。这意味着您可以打开从客户端(浏览器)到 Node 服务器的套接字,并且它们可以通过长期 session 相互通信。优点是更新通常是即时的,而不必像轮询情况那样产生发出另一个 HTTP 请求的成本。缺点是它使用可能是长期存在的套接字连接,并且任何服务器上通常都有一个套接字池,处理许多套接字的能力有限。有多种方法可以解决这个问题,但如果这对您来说是一个大问题,您可能需要进行轮询。
轮询是您在服务器上设置客户端 JS 代码时不时访问的端点的地方。该端点将返回您更新的信息。缺点是您现在正在发出新请求以获取更新,如果预计会出现大量更新并且应用程序预计会以尽可能及时的方式更新(尽管大多数情况下轮询就足够了),那么这可能是不可取的。优点是您不会无限期地在服务器上打开实时连接。
同样,还有更多的优点和缺点,这些只是显而易见的。您决定如何实现它。当客户端从这些机制中的任何一个接收数据时,您可以以任何合适的方式更新 UI。
从服务器端,您将需要一种方法来保存来自 CloudMQTT 的信息。有多种方法可以做到这一点。如果您不关心内存消耗,并且可以在客户端一段时间内不请求旧数据的情况下丢弃旧数据,那么可以将其存储在内存中的常规 javascript 对象 {}
中。如果您确实关心在服务器重新启动/崩溃之间保留数据(可能是最好的),那么您可以保留类似 Redis 的内容。 , Mongo 、任何 SQL 存储(如果您的数据本质上是关系型数据),甚至是磁盘上的常规 JSON 文件(请参阅 fs.writeFile )。
希望这有助于您朝着正确的方向迈出一步!
关于javascript - 使用 CloudMQTT 进行 Node JS 实时文本更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32744490/