我正在构建一个node.js&表达通过TCP连接到IoT设备的应用程序。在应用程序的索引页面上,我正在呈现页面并运行一个开始ping设备的函数。最终设备响应,我打开一个TCP套接字,我使用socket.io向前端发出一个事件。此过程所需的时间比呈现页面的时间长得多。
刷新页面时,我不想重新ping设备。我需要“保存”连接状态。知道设备已经连接,我不需要重新运行我的连接功能。
可能的解决方案。我的想法:
TCP套接字状态的布尔变量。在node.js网络文档中,我没有看到套接字连接状态的变量。另一个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上发帖。我仍然在学习相关的关键词,并且无法找到解决这个问题的方法。
答案 0 :(得分: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
});
可能有更好的方法可以做到这一点,但这是适用于我的方法。当应用程序重新加载status.isOnline时会启动为false,因为它尚未连接,所以可以正常工作。