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

标签 node.js sockets express tcp state

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

当我刷新页面时,我不想重新 ping 设备。我需要“保存”连接状态。知道设备已经连接,我不需要重新运行我的连接函数。

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

  1. TCP 套接字状态的 bool 变量。在 node.js 网络文档中,我没有看到套接字连接状态的变量。另一个 stackoverflow 回答说 ._connected 没有记录并且可以工作但是“这不是 node.js 的方式”。

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

  3. 使用局部变量。然而,这是在页面加载时“重置”的。

  4. 在 JSON 文件中保存状态。使用带有状态信息的单独 deviceState.js 文件。我可以导出该文件并将其用作我的索引页面中的必需模块。

我的问题是 - 即使页面重新加载,我如何保存设备连接的状态?我的直觉是 session 和局部变量的一些组合,但我不确定这些是如何可以根据我上面的观点工作。

这是索引路由的简化版本。让我知道它是否缺少任何有助于解决此问题的内容:

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 上发帖。我还在学习相关的关键词,一直找不到解决这个问题的方法。

最佳答案

我解决这个问题的方法是#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,因为它尚未连接,所以可以正常工作。

关于node.js - 页面刷新后保存 TCP 套接字(连接)状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40252382/

相关文章:

c++ - TCP Recv 使用 select() 返回 1 字节读取

node.js - hapi 和 node.js 创建 REST API 服务器

java - Java中使用线程进行套接字编程

node.js - 使用 makeAugmentedSchema 时必须提供 typeDefs

c - 用 C 检测网络事件

javascript - 需要中间件功能的路由

javascript - Facebook 如何知道某人是否在线

javascript - 使用动态路由时,中间件功能被执行多次而不是一次

css - https请求响应css文字乱码

node.js - 从 LAN 内部和外部使用 socket.io