Node.js Express+;从POST请求到主题中发布的MQTT

Node.js Express+;从POST请求到主题中发布的MQTT,node.js,express,post,mqtt,Node.js,Express,Post,Mqtt,我需要一个Node.js web服务,它接受特定的POST请求,该请求将触发特定MQTT主题中的发布。 我使用Express来监听请求,脚本的这一部分工作得很好。 问题是,我认为它应该在什么时候触发发布主题以执行下行链路。 没有快速部分的代码可以正常工作。因此,Express似乎会干扰MQTT。但是与代理的连接工作正常。只有发布过程不起作用 var express = require('express'); var bodyParser = require('body-parser'); var

我需要一个Node.js web服务,它接受特定的POST请求,该请求将触发特定MQTT主题中的发布。 我使用Express来监听请求,脚本的这一部分工作得很好。 问题是,我认为它应该在什么时候触发发布主题以执行下行链路。 没有快速部分的代码可以正常工作。因此,Express似乎会干扰MQTT。但是与代理的连接工作正常。只有发布过程不起作用

var express = require('express');
var bodyParser = require('body-parser');
var mqtt = require('mqtt')
var fs = require('fs')
var path = require('path')
const util = require('util')


var app = express();

var CERT = //certificate
var PORT = //port
var HOST = // host

var options = {
   port: PORT,
   host: HOST,
   clientId: //client_id
   username: //uname
   password: //pswd
   cert: CERT,
   rejectUnauthorized: false,
   protocol: 'mqtts'
}
var client;
var jsonParser = bodyParser.json();
var port = process.env.PORT || 8080;

app.use(express.static('public'));
app.get('/', function (req, res) {
   res.render(__dirname + "/public/index.html");
})

client = mqtt.connect(options);

client.on("connect", () => {
   console.log("MQTT connected");
})

client.on('message', function (topic, message) {
   var msg = JSON.parse(message)
   console.log("topic: " + topic + " msg:" + util.inspect(msg))
});


app.post('/', jsonParser, function (req, res) {
   // Prepare output in JSON format
   data = {
      dev_id: req.body.dev_id,
      pswd: req.body.password,
      tx_cycle: req.body.tx_cycle
   };
   if (data.pswd != "password") {
      console.log("Wrong password")
   }
   else {
      console.log(data);
      var topic = 'publish_topic';
      var tx_cy = data.tx_cycle;
      var msg = '{"port":"222","payload":"' + tx_cy + '","confirmed": false,"window":"BOTH","priority":0}';
      console.log('Try to send downlink message, for ' + data.dev_id + ' set to ' + data.tx_cycle + ' min -> hex ' + tx_cy);
      client.subscribe('reply/+/id/+');

      client.publish(topic, msg);
      res.status(200).send(msg + " sent to broker");
   }
});



var server = app.listen(port, function () {
   var host = server.address().address
   var port = server.address().port

   console.log("App listening at http://%s:%s", host, port)
})

我解决了这个问题。代理拒绝了客户端id,因为它不是唯一的。更改它解决了问题。

为什么要在post处理程序中订阅?最好在
client.on('connect',…)
回调中执行一次。将对
client.publish()
的调用包装在try-catch块中,以查看是否/为什么失败。没有理由不起作用。谢谢你的建议。我试着用不同的方法来理解这个问题。现在我设法解决了这个问题,没有必要编辑这个问题以将其标记为已解决。返回并将您自己的答案标记为已接受,因为这将更容易在搜索结果中找到。客户端id需要全局唯一,如果您有两个客户端具有相同的客户端id,则第一个客户端将在第二个客户端连接时断开连接。如果您已启用自动重新连接,则它们将重复彼此启动。