2016-07-13 2 views
-1

일주일 전에 외부 소스에서 하루 중 시간대로 끌어온 메트릭을 표시 할 수있는 함수를 만들어야합니다. 현재 서버를 설정하는 방법은 오전 6시와 오전 7시에 외부 소스에서 메트릭을 가져 오는 방법을 사용하는 것입니다. 그런 다음이 데이터를 일주일 동안 저장 한 다음 그날부터 자정에 시작하는 해당 날짜의 데이터를 표시해야합니다.요일을 기준으로 데이터를 저장하고 표시하는 노드 JS 서버를 만듭니다.

내가 오늘 날짜보다 일주일 전날의 데이터를 참조 할 수 있도록 매일 수집하는 데이터를 저장하고 보관하려고합니다 (예 : 오늘 월요일에 데이터에 액세스하는 경우). 지난 월요일 기록). 처음 생각한 것은 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과 풀 메트릭 방법이 생략되어이 질문이 더 일반적입니다. 무의미한 값이 배열에 처음부터 넣어 졌으므로 어느 배열이 처음에 출력되는지 알 수 있습니다.

+0

이 아닌 아래의 답변이 당신을 위해 작동 않았다 노드 크론을 적용하면 간격을 설정하는 방법? – Iceman

답변

1

node-schedule과 같은 외부 모듈을 사용해 보셨습니까? 주기적으로 문제가 발생할 수 있습니다. 예를 들어,이 모듈을 사용하면 주기적으로 원하는 간격 (예 : 1 주)을 설정하고 어떤 작업을 실행할 수 있습니다.

고려해야 할 또 다른 포인트는 시간대입니다. 다른 tz 서버에서 코드를 커밋하고 카운트에 실패하면 문제가 될 수 있습니다. moment-timezone 모듈은 좋은 리소스입니다.

0

이 줄에있는 것이 도움이 될 수 있습니다.

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); 

크론 작업 :

var CronJob = require('cron').CronJob; 
new CronJob('* * * * * *', function() { 
    console.log('You will see this message every second'); 
}, null, true, 'time zone'); 
관련 문제