我是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()
但未找到任何溶剂
答案 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);