mqtt async等待messagse然后响应http post请求

时间:2018-04-23 16:50:24

标签: javascript node.js http async-await mqtt

我是node.js的新手我正在尝试建立一个webhook,我在那里得到一个HTTP post请求并希望通过mqtt发送请求并等待参考MQTT消息的mqtt消息然后发送这些消息的响应通过HTTP

  var array = [];
  const client = mqtt.connect(MQTTServer)
  var count =0;
  client.on('message', (topic, message) => {

  array[count] = message 
  count ++ 

  }

app.post('/tesr', function (request, response) {

    client.publish ('outTopic' , 'request ');
    client.subscribe('inTopic')


    //wait for multiple mqtt message in  MQTT callback 


    //after all messages received or timeout  return  here
     client.unsubscribe('inTopic')
    count = 0
    response.status(200).json(array);

  }

所以尝试了while()seInterval()但未找到任何溶剂

2 个答案:

答案 0 :(得分:2)

您不需要在路由处理程序中调用response.send(array),您可以在外部执行此操作。

var array = [];
var resp;
var n = 10; //number of messages to wait for
var timeOutValue = 5000; //wait 5 seconds
var timer;

const client = mqtt.connect(MQTTServer)
var count =0;
client.on('message', (topic, message) => {
  array.push(message); 
  count ++ 
  if (count == n) {
     resp.send(array);
     client.unsubscribe('inTopic');
     resp = undefined;
     counter = 0;
     array = [];
     clearTimeout(timer)
  }
}

app.post('/test', function (request, response) {

resp = response;
client.publish ('outTopic' , 'request ');
client.subscribe('inTopic');

  timer = setTimeout(function(){
    if (resp) {
        resp.send(array);
        resp = undefined;
        client.unsubscribe('inTopic');
        counter = 0;
        array = []
    }
  }, timeOutValue);

}

它并不漂亮(而且它一次只能打一次......)但它应该有效。

答案 1 :(得分:0)

您可以定义全局变量(例如global.results={},并在client.on('message', callback)中使用即将到来的消息更新值。

  client.on('message', (topic, mqttMessage) => {
    // mqttMessage is Buffer
    global.results.receiveResult = mqttMessage.toString();
    client.end();
  });

现在,在您的API中,您可以使用settimeout根据global.results的值返回适当的响应:

  setTimeout(() => {
    console.log('printing results', global.results);
    if (global.results.publishResult !== 'Published Successfully') {
      return res
        .status(500)
        .send({ data: global.results, message: 'Publish Failed' });
    }
    if (!global.results.receiveResult) {
      return res
        .status(500)
        .send({ data: global.results, message: 'Published but Confirmation Not received' });
    }
    return res
      .status(200)
      .send({ data: global.results, message: 'Response from mqtt' });
  }, timeout);