Javascript mqtt异步等待消息,然后响应http post请求

Javascript mqtt异步等待消息,然后响应http post请求,javascript,node.js,http,async-await,mqtt,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

我是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()
,但没有找到任何解决方案您不需要调用
响应。从路由处理程序内部发送(数组)
,您可以在外部执行

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);

}

它并不漂亮(而且是一次调用一次…),但应该可以工作。

您可以定义一个全局变量(例如
global.results={}
,并在
客户端中。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);

您需要为下一条
inTopic
消息创建一个承诺,并
等待它。这可以在循环中完成。如何让
客户机.on()
回调函数在消息到达时触发,然后在收到所有x条消息时触发,或者在以下情况下超时not@saniljhaveri您是否成功地对多个请求执行了此操作?是否有删除接受标志的特殊原因?我很高兴您在代码为
setTimeout()时询问使用您的解决方案
它不异步收集任何回调MQTT消息,因此它在响应中不返回任何内容,并显示“忽略来自已完成事件的异常”,我可以通过使用async await来实现它,但我必须将代码部署到firebase函数上,firebase函数运行的node.js版本6.11.5不支持async await,因此我想找到一种使用just promise()的方法但是在这里,HTTP会话是在没有像以前一样等待promise准备就绪的情况下完成的。如果你想在到达超时时返回收到的消息的短列表,只需在timeout函数中编辑代码以返回它们,而不是错误。我已编辑了答案,使其不在超时时引发错误,而是发送多少个错误已接收ages。它一次只能处理一个HTTP请求(因为只有一个全局resp对象)