我正在构建一个通过 TCP 连接到 IoT 设备的 node.js & express 应用程序。在应用程序的索引页面上,我正在呈现页面并运行一个开始对设备执行 ping 操作的功能。最终设备响应,我打开一个 TCP 套接字,然后我使用 socket.io 向前端发出一个事件。此过程比呈现页面的时间要长得多。
当我刷新页面时,我不想重新 ping 设备。我需要“保存”连接状态。知道设备已经连接,我不需要重新运行我的连接函数。
可能的解决方案。我的想法:
TCP 套接字状态的 bool 变量。在 node.js 网络文档中,我没有看到套接字连接状态的变量。另一个 stackoverflow 回答说 ._connected 没有记录并且可以工作但是“这不是 node.js 的方式”。
session 。我可以在 session 中保存设备状态,并在重新加载时跟踪它。但是,根据我的阅读,我无法在调用 res.render 后保存 session 信息。我特别想在 重新加载后保存连接状态。
使用局部变量。然而,这是在页面加载时“重置”的。
在 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/