Javascript mqtt异步等待消息,然后响应http post请求
我是node.js新手。我正在尝试制作一个webhook,在这里我得到一个HTTP post请求,并希望通过mqtt发送一个请求,等待mqtt消息引用mqtt消息,然后通过HTTP发送这些消息一个响应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
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对象)