我有一个节点服务器,它连接到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 **
});
});
});
答案 0 :(得分:1)
基本上,您需要一种方法来为客户端(带有EJS的浏览器代码 - HTML,CSS和JS)接收实时更新。从客户端到节点服务基本上有两种方法:
客户端实例化的websocket会话。
polling方法。
有什么区别?
引擎盖下,websocket是全双工通信机制。这意味着您可以从客户端(浏览器)打开一个套接字到节点服务器,并且它们可以通过长期会话以两种方式相互通信。专家认为,更新通常是即时的,而不必像在轮询案例中那样产生另一个HTTP请求的成本。 con是它使用可能是长期存在的套接字连接,并且在任何服务器上通常都有一个套接字池,它处理许多套接字的能力有限。有很多方法可以扩展这个问题,但如果这是你的一个大问题,你可能想要进行民意调查。
轮询是指在服务器上设置客户端JS代码偶尔会遇到的端点。该端点将返回更新的信息。可以理解的是,您现在正在发出新请求以获取更新,如果预计会有大量更新,并且应该尽可能以最及时的方式更新应用程序,那么这可能是不可取的(大部分时间)轮询就足够了)。专业人士是您无法在服务器上无限期地打开实时连接。
同样,还有更多的利弊,这些只是显而易见的。您决定如何实现它。当客户端从这些机制中的任何一个接收数据时,您可以以任何合适的方式更新UI。
从服务器端,您需要一种方法来保留来自CloudMQTT的信息。有多种方法可以做到这一点。如果你不关心内存消耗并且如果客户端暂时没有请求它可能会丢弃旧数据,那么可以将它存储在常规javascript对象{}
的内存中。如果您确实关心在服务器重启/崩溃之间保持数据(可能是最好的),那么如果您的数据本质上是关系型的,那么您可以坚持使用Redis,Mongo之类的任何SQL存储,甚至是磁盘上的常规JSON文件(参见fs.writeFile)。
希望这有助于您朝着正确的方向迈出一步!