Я создаю приложение node.js &, которое подключается к устройству IoT через TCP. На индексной странице приложения я просматриваю страницу и запускаю функцию, которая начинает пинговать устройство. В конце концов устройство отвечает, я открываю TCP-сокет, и я использую socket.io, чтобы передать событие на передний конец. Этот процесс занимает гораздо больше времени, чем время для отображения страницы.Сохранение состояния сокета TCP (соединение) после обновления страницы
Когда я обновляю страницу, я не хочу переписывать устройство. Мне нужно «сохранить» состояние соединения. Зная, что устройство уже подключено, мне не нужно повторно запускать мою функцию соединения.
Возможные решения. Мои мысли:
Булева переменная для статуса сокета TCP. В документации net.js net я не вижу переменную для состояния подключения сокета. Другой ответ stackoverflow говорит. ._connected недокументирован и может работать, но «это не путь node.js».
Сессии. Я мог бы сохранить состояние устройства в сеансе и отслеживать его при повторной загрузке. Однако, основываясь на моем чтении, я не могу сохранить информацию о сеансе после вызова res.render. Я специально хочу сохранить статус подключения после перезагрузить.
Используйте локальную переменную. Однако это «перезагрузка» при загрузке страницы.
Сохраните состояние в файле JSON. Используйте отдельный файл deviceState.js с информацией о состоянии. Я мог бы экспортировать этот файл и использовать его как необходимый модуль на моей индексной странице.
Мой вопрос - как я могу сохранить состояние подключения устройства даже при загрузке страницы? Моя догадка есть какая-то комбинация сессии и локальной переменной, но я не уверен, как они могут работать на основе моих пунктов выше.
Вот упрощенная версия маршрута указателя. Дайте мне знать, если у него нет ничего, что могло бы помочь в решении этой проблемы:
router.get('/', function(req, res, next) {
function connectToDevice() {
// ping device and open TCP socket...
// eventually the following function is called as an eventlistener to
// a net socket.on('connect')...
function onConnect(socket) {
res.io.emit('machine-online');
}
}
connectToDevice();
res.render('index', {
title: 'Page title'
});
}
Это мое первое сообщение о stackoverflow. Я все еще изучаю соответствующие ключевые слова и не смог найти решение этой проблемы.
Я бы использовал сеанс, вы уверены в факте 'res.render'? Ты пробовал? В любом случае, я думаю, вы могли бы использовать обещания для синхронного вызова, если это приемлемо для того, чтобы страница зависала для ответа сервера, а затем разрешить 'res.render' выполнить. – Marcs
Невозможно повесить https://github.com/expressjs/session "Этот метод [session.save()] автоматически вызывается в конце ответа HTTP, если данные сеанса были изменены (хотя это поведение может быть изменено с различными опциями в конструкторе промежуточного программного обеспечения). Из-за этого обычно этот метод не нужно вызывать. В некоторых случаях полезно вызвать этот метод, например, долгоживущие запросы или в WebSockets. " Поэтому, поскольку я дал ответ (res.render), сеанс автоматически сохраняется. Я не уверен, могу ли я снова сохранить информацию о сеансе явным образом. – user25449