【问题标题】:Showing MQTT response on a node server API在节点服务器 API 上显示 MQTT 响应
【发布时间】:2019-11-14 08:16:09
【问题描述】:

我正在尝试使用 express 将从 MQTT 收到的响应输出到节点服务设置。

每秒钟都会从mqtt服务收到一条json字符串消息。 响应将在 /main API 上输出,我将从我正在开发的 Ionic 4 移动应用程序中调用它。

但是,现在我无法在服务器本身上显示数据只是为了检查,我还没有想到如何在服务器上不断更新数据。页面不刷新它只是继续加载。

const mqtt = require('mqtt')
const express = require('express')

const PORT = 8000
const app = express()

var client = mqtt.connect("mqtt://bac.com")

client.on('connect', () => {
    console.log("Connected")
    client.subscribe('/test')
})

app.get("/", (req, res) => {
    res.send("ROOT");
});

app.get("/main", (req, res) => {
    client.on('message', (topic, message) => {
        res.send(message)
    })
});

app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

【问题讨论】:

  • 服务器端事件或网络套接字 - 前者可能是“更轻”且更容易实现的选项,因为数据将是从服务器到客户端的单向处理
  • 当您可以在 HTML 页面中订阅时,为什么要订阅服务器端是通过 Websockets 使用 MQTT 的自我
  • @hardillb 我正在尝试创建一个不断发送响应 (json) 的 API。可以通过在 html 页面中显示,但我不想这样做。
  • HTTP REST 接口无法继续发送结果,如果您想要持续的结果流,请在最终消费者处使用 MQTT

标签: javascript node.js rest express mqtt


【解决方案1】:

您需要以某种方式将数据存储在服务器端,以便您的方法正常工作。

实现某种存储消息的存储服务。您的客户端需要响应队列消息并将这些消息推送到存储中,您的 api 操作将从存储中检索它们,而不是从队列中检索它们。

const mqtt = require('mqtt');
const express = require('express');

const PORT = 8000;
const app = express();
const storageService = require("SOME KIND OF STORAGE SERVICE");

var client = mqtt.connect("mqtt://bac.com");

client.on('connect', () => {
    console.log("Connected")
    client.subscribe('/test')
});
client.on('message', (topic, message) => {
    storageService.save(topic, message); //or this has to provide storage and enterpretation of the data comming in
});
app.get("/", (req, res) => {
    res.send("ROOT");
});

app.get("/main", (req, res) => {
    res.send(storageService.getAll());
});

app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

您还可以重新访问整个实现,并通过套接字或其他类型的持久连接将消息推送到前端。

【讨论】:

    【解决方案2】:

    我从类似的问题here 中找到了解决方法。在服务器端,它将根据收到的消息发送数据。在客户端,每秒调用一次 ajax 来检索服务器端的数据。

    如链接中所述,这确实是一个糟糕的模式。但是,这将适合那些对 MQTT 服务进行更改有限制的人。

    // Server.js
    const mqtt = require('mqtt')
    const express = require('express')
    
    const PORT = 8000
    const app = express()
    
    var client = mqtt.connect("mqtt://bac.com")
    var mqttMessage
    
    client.on('connect', () => {
        console.log("Connected")
        client.subscribe('/test')
    })
    
    client.on('message', (topic, message) => {
        console.log('Topic: ' + topic + '\nMessage: ' + message)
        mqttMessage = message
    })
    
    app.get("/", (req, res) => {
        res.sendFile("__dirname + "/index.html");
    });
    
    app.get("/main", (req, res) => {
        if(mqttMessage)
            res.send(mqttMessage);
        else
            res.status(404).send();
    });
    
    app.listen(PORT, () => {
        console.log(`Server is listening on port ${PORT}`);
    });
    

    在 index.html 页面上:

    <!DOCTYPE html>
    <meta charset="utf-8">
    
    <body>
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
        <script>
            $(document).ready(
                function () {
                    setInterval(function () {
                        $.get('/main', function (res) {
                            $('#data').text(res);
                        });
                    }, 1000);
                }
            );
        </script>
        <p id="data"></p>
    </body>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多