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

Javascript 使用CloudMQTT更新节点JS实时文本,javascript,node.js,Javascript,Node.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.connec

我有一个节点服务器,它连接到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的浏览器代码)接收实时更新。从客户端到节点服务,基本上有两种方法可以做到这一点:

  • 由客户端实例化的会话

  • 一种方法

  • 有什么区别

    在引擎盖下,websocket是全双工通信机制。这意味着您可以打开从客户端(浏览器)到节点服务器的套接字,它们可以在一个长期会话中双向通信。其优点是,更新通常是即时的,而不必像轮询那样产生另一个HTTP请求的成本。缺点是它使用的套接字连接可能是长期存在的,并且任何服务器上通常都有一个套接字池,它处理许多套接字的能力有限。有很多方法可以解决这个问题,但如果这对你来说是个大问题,你可能会选择投票

    轮询是指在服务器上设置一个端点,客户端JS代码时不时点击该端点。该端点将返回更新的信息。缺点是你现在提出一个新的请求以获取更新,如果预计会有很多更新,并且应用程序可能会以最及时的方式更新,那么这可能是不可取的(尽管大多数时间轮询是足够的)。专业的做法是,您不会无限期地在服务器上打开实时连接

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

    从服务器端,您将需要一种方法来持久化来自CloudMQTT的信息。有多种方法可以做到这一点。如果您不关心内存消耗,并且如果客户机一段时间没有请求旧数据,您可以将其丢弃,那么只需将其存储在常规javascript对象
    {}
    的内存中就可以了。如果您确实关心在服务器重启/崩溃之间持久化数据(可能是最好的),那么您可以持久化到任何SQL存储(如果您的数据本质上是关系型的),甚至是磁盘上的常规JSON文件(请参阅)


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

    您可以使用socket.io在浏览器中实时更新客户端。您可以共享连接云mqtt和Nodejs的代码吗?谢谢您的帮助,我最初确实看过socket io。我将尝试实现此功能。@Carl:您能分享连接mqtt和Nodejs的代码吗?