Спасибо jfriend00 за указание в правильном направлении. Сначала опубликованный код был совершенно неверным. Я был очень смущен этим и впоследствии переименовал файл punchitRoute, чтобы продолжить работу с ним другим способом, но забыл переименовать нужный файл в server.js! Это была глупая ошибка.
Второй комментарий о обработчике события для client.on('message', ...)
дал мне подсказку, необходимую для просмотра цикла событий.
Идея состояла в том, чтобы привязать изображение с веб-камеры с помощью mqtt из запроса get. Запрос get поступает на экспресс-сервер, вызывает подписку на тему с именем ' return' и публикуется в теме с именем ' sunrise' с сообщением 'click' .
Существует отдельная конечная точка в локальной сети, которая прослушивает локального брокера mqtt (оба совместно используемого с экспресс-сервером), который прослушивает тему 'sunrise' . Эта конечная точка вещания «вернула» после того, как изображение было сохранено в корзину S3, и отправило URL-адрес изображения в качестве сообщения обратно на сервер, выполняющий запрос get. Функции mqtt работают хорошо, у меня была проблема с событием ответа, которое не заканчивалось при завершении ответа. Для этого тоже нужно было изменить несколько вещей.
- переместил res.send в функцию, вызываемую после client.on (это не сработало полностью, это позволило выполнить отправку, но все равно вернуло ошибку)
- добавлены источники событий, чтобы увидеть, какое событие вызывалось снова и снова (это дало мне некоторое представление о происходящем, но все равно не устранило ошибку)
- исследовал дополнительные библиотеки mqtt (в итоге остановился на async-mqtt)
- добавлен client.unsubscribe для обеих тем после функции res.send (это не имело никакого эффекта)
- наконец нашел этот ответ, который помог мне понять все это время, которое я мог просто позвонить client.once!
вот код запроса на получение:
punchitRoute.get('/', async function(req, res){
//adding event listner 'send'
mqEvent.on('send', function(){
console.log('added send');
});
let sendit = function(url){
'send', //emmitting 'send'
res.status(200).send(
'<img src='+url.toString()+' />'+
'<h1>PUNCHED!</h1>'+
'<p>'+
'name: garfield <br/> time: '+moment(Date.now()).tz("America/Louisville").format('MM-DD-YYYY'));
}
client.subscribe('returned', function(){
console.log('subscribed');
});
client.publish('sunrise', 'click');
//changed this to .once and no more errors
await client.once('message', async function callout(topic, url){
try {
mqEvent.on('message', function(){
console.log('added message');
});
sendit(url.toString());
// console.log(res);
client.unsubscribe('returned', ()=>{
console.log('unsubscribed');
});
client.unsubscribe('sunrise', ()=>{
console.log('unsubscribed publish');
});
//clearing out the send event listeners
mqEvent.removeAllListeners('send');
console.log(mqEvent.listenerCount('send'));
//clearing out the message event listeners
mqEvent.removeAllListeners('message');
} catch(e){
console.log(e);
console.log('error');
}
})
});
Надеюсь, это может кто-то другой столкнулся с подобной проблемой.