2016-10-26 2 views
1

Я создаю приложение node.js &, которое подключается к устройству IoT через TCP. На индексной странице приложения я просматриваю страницу и запускаю функцию, которая начинает пинговать устройство. В конце концов устройство отвечает, я открываю TCP-сокет, и я использую socket.io, чтобы передать событие на передний конец. Этот процесс занимает гораздо больше времени, чем время для отображения страницы.Сохранение состояния сокета TCP (соединение) после обновления страницы

Когда я обновляю страницу, я не хочу переписывать устройство. Мне нужно «сохранить» состояние соединения. Зная, что устройство уже подключено, мне не нужно повторно запускать мою функцию соединения.

Возможные решения. Мои мысли:

  1. Булева переменная для статуса сокета TCP. В документации net.js net я не вижу переменную для состояния подключения сокета. Другой ответ stackoverflow говорит. ._connected недокументирован и может работать, но «это не путь node.js».

  2. Сессии. Я мог бы сохранить состояние устройства в сеансе и отслеживать его при повторной загрузке. Однако, основываясь на моем чтении, я не могу сохранить информацию о сеансе после вызова res.render. Я специально хочу сохранить статус подключения после перезагрузить.

  3. Используйте локальную переменную. Однако это «перезагрузка» при загрузке страницы.

  4. Сохраните состояние в файле 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. Я все еще изучаю соответствующие ключевые слова и не смог найти решение этой проблемы.

+0

Я бы использовал сеанс, вы уверены в факте 'res.render'? Ты пробовал? В любом случае, я думаю, вы могли бы использовать обещания для синхронного вызова, если это приемлемо для того, чтобы страница зависала для ответа сервера, а затем разрешить 'res.render' выполнить. – Marcs

+0

Невозможно повесить https://github.com/expressjs/session "Этот метод [session.save()] автоматически вызывается в конце ответа HTTP, если данные сеанса были изменены (хотя это поведение может быть изменено с различными опциями в конструкторе промежуточного программного обеспечения). Из-за этого обычно этот метод не нужно вызывать. В некоторых случаях полезно вызвать этот метод, например, долгоживущие запросы или в WebSockets. " Поэтому, поскольку я дал ответ (res.render), сеанс автоматически сохраняется. Я не уверен, могу ли я снова сохранить информацию о сеансе явным образом. – user25449

ответ

0

Способ, которым я решил это # ​​4, сохранить состояние во внешнем JSON.

deviceStatus.js: Файл в корне структуры приложения, который содержит некоторую информацию в объекте JSON.

var status = {}; 
var deviceStatus; 

deviceStatus = function() { 
    status = { 
     "isOnline": false, 
     }; 
    return status; 
}; 

module.exports = deviceStatus(); 

Затем в моем index.js: требуется модуль deviceStatus.

var status = require('../deviceStatus'); 

И я использую это для отображения страницы: В функции (не показаны) connectToDevice(), я установил status.isOnline == TRUE. Итак, если устройство находится в автономном режиме, я подключаю и обрабатываю страницу. Если нет, только отрисуйте страницу, не подключайтесь.

if(status.isOnline == false) { 
     connectToDevice(); 
    } 
res.render('index', { 
    title: 'Page title', 
    machineOnline: status.isOnline 
}); 

Возможно, это лучший способ сделать это, но это метод, который работает для меня. Когда приложение повторно загружает статус.isOnline начинается как false, который работает, так как он еще не подключен.