gpt4 book ai didi

javascript - 包含已更新变量的文件,并且其他文件看到该更改?

转载 作者:行者123 更新时间:2023-12-03 07:58:49 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的工具,它可以 ping 一堆 url 来监视它们的状态,并使用每个应用程序的状态更新一个变量。

我还有另一个文件,我希望能够随时执行该文件以从该变量获取每个应用程序的当前状态。

这是我的主文件,您可以看到有 2 个导出 - 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());

问题是,consum.js 只显示了 index.js 中初始 app 变量的内容,即:

{
myApp: {
url: 'http://myUrl.com',
status: null,
lastUpdatedAt: new Date()
}
};

当运行 start() 命令的进程显示不为空的更新状态时。

如何才能使 Consumer.js 能够看到 start.js 正在更新的变量的值?

如果可能的话,我希望不必使用数据存储。最坏的情况是我写入文件,运行 redis、mongo 或其他一些数据存储,但我试图避免这种情况,使这个应用程序尽可能简单。

最佳答案

您在 start.jsconsume.js 中使用相同的代码 index.js,但创建了两个单独的实例当你运行每个文件时。也就是说,apps 变量在 start.js 创建的实例中发生变化,但 consume.js 中没有任何内容告诉您的代码更改apps 变量。

如果您不保存状态历史记录,或将数据保存到数据存储中,那么启动例程的意义何在?您只需调用 checkAllStatuses 即可,然后在您希望使用数据时返回结果。

编辑以下是将两个文件(start.jsconsume.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() );
});

});

关于javascript - 包含已更新变量的文件,并且其他文件看到该更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34682675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com