页面刷新后保存 TCP 套接字(连接)状态

Save state of TCP socket (connection) after page refresh

我正在构建一个 node.js & express 应用程序,它通过 TCP 连接到 IoT 设备。在应用程序的索引页面上,我正在呈现页面并 运行 设置一个开始对设备执行 ping 操作的函数。最终设备响应,我打开一个 TCP 套接字,然后我使用 socket.io 向前端发出一个事件。此过程比呈现页面的时间要长得多。

当我刷新页面时,我不想重新ping 设备。我需要 "save" 连接状态。知道设备已经连接上了,我应该不需要重新运行我的连接函数了。

可能的解决方案。我的想法:

  1. TCP 套接字状态的布尔变量。在 node.js 网络文档中,我没有看到套接字连接状态的变量。另一个 Whosebug 的回答说 ._connected 没有记录并且可以工作但是 'this is not the node.js way'.

  2. 会话。我可以在会话中保存设备状态,并在重新加载时跟踪它。但是,根据我的阅读,调用 res.render 后我无法保存会话信息。我特别想保存连接状态after reload.

  3. 使用局部变量。然而,这是 'reset' 页面加载。

  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'
    });
}

这是我第一次在 Whosebug 上发帖。我还在学习相关的关键词,一直找不到解决这个问题的方法。

我解决这个问题的方法是#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
});

可能有更好的方法来执行此操作,但这是适合我的方法。当应用程序重新加载时,status.isOnline 开始为 false,因为它尚未连接,所以可以正常工作。