我需要创建一个功能,可以在一周前显示一天中不同时段从外部来源提取的指标。我当前设置服务器的方式是使用一种方法,该方法在早上6点和早上7点从外部源获取指标。然后我需要将这些数据存储一周,然后显示当天从一天午夜开始的那一天的数据。
我正在尝试存储和存档我在每天收集的数据,以便我可以参考当天前一周的每日数据(例如,如果今天是星期一,则访问记录的数据上周一)。我最初的想法是创建一个名为millisTillMidnight
的方法,它将我每天跟踪的数据转换为每天午夜附近的不同数组,但我无法使该方法起作用。理想情况下,我需要能够在一周中当前一周之前的一周内显示应用程序中度量标准的每小时数据。
以下是我将作为heroku应用程序托管的服务器代码。如何构建此服务器,以便在部署时可以全天记录数据,存储一周,然后从记录日期开始显示一周?
var http = require('http');
var request = require('request');
var server = http.createServer(onRequest);
var port = Number(process.env.PORT || 3000)
server.listen(port);
var stat_a = [9, 9]; //display array
var tmp_stat_a = [0, 0]; //Holds the metric data for the day
var m_stat_a = [1, 1]; //monday archive
var t_stat_a = [2, 2]; //tuesday archive
var w_stat_a = [3, 3]; //wednesday archive
var th_stat_a = [4, 4]; //thursday archive
var f_stat_a = [5, 5]; //friday archive
var sa_stat_a = [6, 6]; //saturday archive
var s_stat_a = [7, 7]; //sunday archive
//----------------------------------------------------
function onRequest(req, res){
var Url = //URL
request(Url, function (error, response, body) {
var data = error;
var status = 404;
if(!error){
var now = new Date();
var millisTill6 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 6, 0, 0, 0) - now;//6 AM
if (millisTill6 < 0) {
millisTill6 += 86400000;
}
setTimeout(function(){
tmp_stat_a[0] = //get metric
}, millisTill6);
var millisTill7 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 7, 0, 0, 0) - now; //7 AM
if (millisTill7 < 0) {
millisTill7 += 86400000;
}
setTimeout(function(){
tmp_stat_a[1] = //get metric
}, millisTill7);
var millisTillMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 58, 0, 0) - now; //archive temp array and display data for next day at midnight
if (millisTillMidnight < 0) {
millisTillMidnight += 86400000;
}
setTimeout(function(){
var d = new Date();
var n = d.getDay();
if(n == 0) //SUNDAY
{
for(i=0; i<2; i++)
{
s_stat_a[i] = tmp_stat_a[i]; //archive temp array
stat_a[i] = m_stat_a[i]; //set display array to last weeks archive for the next day
}
console.log("0");
}
else if(n == 1) //MONDAY
{
for(i=0; i<2; i++)
{
m_stat_a[i] = tmp_stat_a[i];
stat_a[i] = t_stat_a[i];
}
console.log("1");
}
else if(n == 2) //TUESDAY
{
for(i=0; i<2; i++)
{
t_stat_a[i] = tmp_stat_a[i];
stat_a[i] = w_stat_a[i];
}
console.log("2");
}
else if(n == 3) //WEDNESDAY
{
for(i=0; i<2; i++)
{
w_stat_a[i] = tmp_stat_a[i];
stat_a[i] = th_stat_a[i];
}
console.log("3");
}
else if(n == 4) //THURSDAY
{
for(i=0; i<2; i++)
{
th_stat_a[i] = tmp_stat_a[i];
stat_a[i] = f_stat_a[i];
}
console.log("4");
}
else if(n == 5) //FRIDAY
{
for(i=0; i<2; i++)
{
f_stat_a[i] = tmp_stat_a[i];
stat_a[i] = sa_stat_a[i];
}
console.log("5");
}
else if(n == 6) //SATURDAY
{
for(i=0; i<2; i++)
{
sa_stat_a[i] = tmp_stat_a[i];
stat_a[i] = s_stat_a[i];
}
console.log("6");
}
}, millisTillMidnight);
status = 200;
data = {
aa: stat_a[0],
ab: stat_a[1]
};
}
res.writeHead(status, { 'Content-Type': 'application/json', "Access-Control-Allow-Origin":"*" });
res.write(JSON.stringify(data));
res.end();
});
}
省略了请求URL和Pull Metric方法,使这个问题更加通用。初始没有无意义的值放在数组中,所以我可以先判断出哪个数组正在输出。
答案 0 :(得分:1)
您是否尝试使用外部模块,例如node-schedule?定期问题可能更容易。使用此模块,您可以执行某些任务 定期,设置你想要的intervall,比如说,1周。
需要考虑的另一点是时区。当您将代码提交到另一个tz中的服务器并且它无法计数时,这可能是一个问题。 moment-timezone模块是一个很好的资源。
答案 1 :(得分:0)
这些方面的某些内容可能有所帮助。应用节点cron来设置间隔:
var net = require('net');
var port = Number(process.env.PORT || 3000)
var timeInMs = Date.now();
var weekInMs = 604800000;
var server = net.createServer(function (socket) {
//if time in Ms is time from first ping to now then...
socket.end(timeInMs + '\r\n');
});
server.listen(port);
cron工作:
var CronJob = require('cron').CronJob;
new CronJob('* * * * * *', function() {
console.log('You will see this message every second');
}, null, true, 'time zone');