我正在尝试构建一个简单的工具来ping一堆网址以监控其状态,并根据每个应用的状态更新变量。
我还有另一个文件,我希望能够随时执行该文件以获取该变量中每个应用的当前状态。
这是我的主文件,你可以看到有两个导出--start和getStatuses。
index.js
'use strict';
const rest = require('restler');
const time = require('simple-time');
const seconds = time.SECOND;
// The list of apps to check if are running
var apps = {
myApp: {
url: 'http://myUrl.com',
status: null,
lastUpdatedAt: new Date()
}
};
/**
* Loop through and check the status of every app
*/
function checkAllStatuses() {
for (var name in apps) {
if (apps.hasOwnProperty(name)) {
var app = apps[name];
console.log('app = ', app);
checkAppStatus(name, app);
}
}
}
/**
* Checks the status of an app
*
* @param name - The name of the app
* @param app - The app that we're checking the status of
*/
function checkAppStatus(name, app) {
var req = rest.get(app.url);
req.on('complete', function(result, response) {
if(response.statusCode !== app.status) {
updateStatus(name, response.statusCode);
}
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});
req.on('timeout', function(data, response) {
console.log('Request timed out');
});
}
/**
* Updates the status of an app
*
* @param app - The app to update the status of
* @param status - The status to update the app to
*/
function updateStatus(name, status) {
apps[name].status = status;
apps[name].lastUpdatedAt = new Date();
}
function getStatuses() {
return apps;
}
function start() {
// Check every 5 seconds
setInterval(checkAllStatuses, 5*seconds);
}
module.exports.start = start;
module.exports.getStatuses = getStatuses;
然后我有一个启动过程的文件:
start.js
'use strict';
const status = require('./index');
status.start();
然后我有一个我想要执行的文件来获取应用程序的当前状态:
consume.js
'use strict';
const status = require('./index');
console.log(status.getStatuses());
问题是consume.js只显示index.js中初始app
变量的确切内容:
{
myApp: {
url: 'http://myUrl.com',
status: null,
lastUpdatedAt: new Date()
}
};
当运行start()
命令的进程显示非空的更新状态时。
我怎样才能使它消耗.js可以看到start.js正在更新的变量的值?
如果可能的话,我不想使用数据存储区。最糟糕的情况是我写入文件,运行redis,mongo或其他一些数据存储,但我试图避免使这个应用程序尽可能简单。
答案 0 :(得分:1)
您在index.js
和start.js
中使用相同的代码consume.js
,但在运行每个文件时创建两个单独的实例。
也就是说,apps
变量在start.js
创建的实例中发生了变化,但consume.js
中没有任何内容告诉您的代码更改apps
变量。
如果您没有保存状态历史记录或将数据保存到数据存储区,那么启动例程中的重点是什么?您只需调用checkAllStatuses
,然后在希望使用数据时返回结果。
修改强>
以下是将两个文件(start.js
和consume.js
)合并为一个文件的示例。它还添加了一个示例socket.io实现,因为您声明通过websockets向客户端提供状态是实际目标。
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
//// Your status library
var status = require('./index');
//// Start getting statuses
status.start();
app.listen(80);
//
// This is just the default handler
// in the socket.io example
//
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.on('connection', function (socket) {
// Someone wants the list of statuses
// This uses socket.io acknowledgements
// to return the data. You may prefer to use
// `socket.emit` instead or an altogether different socket library.
socket.on('status_fetch', function (data, callback_fn) {
callback_fn( status.getStatuses() );
});
});