如何将Node JS编写的MQTT发布/订阅端封装为API支持PostMan调用
实现方案
你可以基于Express搭建HTTP服务,将MQTT客户端逻辑与HTTP路由绑定,对外提供REST API,部署到公网服务器后即可通过Postman调用。
步骤1:安装依赖
首先初始化Node项目,安装所需三方包:
npm init -y npm install express mqtt cors
步骤2:编写整合服务代码
不用单独维护Publisher和Subscriber两个文件,直接整合到API服务中即可,示例代码如下:
const express = require('express'); const cors = require('cors'); const mqtt = require('mqtt'); const app = express(); const PORT = 3000; // 中间件配置 app.use(cors()); app.use(express.json()); // MQTT客户端初始化 const mqttClient = mqtt.connect('mqtt://broker.hivemq.com'); // 存储订阅到的消息,生产环境可替换为数据库 const receivedMessages = []; // MQTT连接成功回调 mqttClient.on('connect', () => { console.log('MQTT客户端连接成功'); // 订阅需要监听的主题,可根据需求扩展动态订阅 mqttClient.subscribe('connected'); // 可在此处追加其他需要订阅的主题 }); // MQTT接收消息回调 mqttClient.on('message', (topic, message) => { const msg = message.toString(); receivedMessages.push({ topic, payload: msg, timestamp: new Date().toISOString() }); // 原有业务逻辑可以保留 if(topic === "connected"){ // handleGarageConnected(message) 此处保留你原来的处理逻辑即可 } }); // 发布MQTT消息接口 app.post('/api/mqtt/publish', (req, res) => { const { topic, payload } = req.body; if(!topic || payload === undefined) { return res.status(400).json({code: 400, msg: '参数缺失,topic和payload为必填项'}); } mqttClient.publish(topic, payload.toString(), (err) => { if(err) { return res.status(500).json({code: 500, msg: '消息发布失败', error: err.message}); } res.json({code: 200, msg: '消息发布成功'}); }); }); // 获取订阅到的消息接口 app.get('/api/mqtt/messages', (req, res) => { res.json({code: 200, data: receivedMessages}); }); // 启动服务 app.listen(PORT, () => { console.log(`API服务启动成功,监听端口${PORT}`); });
步骤3:部署与Postman调用
- 把代码部署到公网可访问的服务器,启动服务:
node server.js,确保服务器安全组开放3000端口 - 发布消息测试:在Postman中新建POST请求,地址为
http://你的服务器公网IP:3000/api/mqtt/publish,请求体选择JSON格式,传入参数:
{ "topic": "你要发布的主题", "payload": "你要发送的消息内容" }
发送请求即可触发MQTT消息发布。
- 查看订阅消息测试:新建GET请求,地址为
http://你的服务器公网IP:3000/api/mqtt/messages,发送请求即可获取服务端订阅到的所有MQTT消息。
注意事项
- 生产环境需要为API添加鉴权逻辑,比如请求头携带校验密钥,避免接口被恶意调用
- 可根据需求扩展接口,比如新增动态订阅主题、清空消息、查询指定主题消息等能力
- MQTT连接可以添加断开重连逻辑,避免网络波动导致服务不可用
- 消息存储如果需要持久化,可以替换数组为Redis、MySQL等存储组件
- 如果使用私有MQTT broker,需要在mqtt.connect方法中传入用户名、密码等校验参数
内容的提问来源于stack exchange,提问作者user15738832
相关产品推荐
相关产品推荐

