NodeJS中的setInterval返回HTTP错误503

时间:2016-02-11 13:42:19

标签: javascript node.js setinterval

我试图每小时收到一次请求。一旦我setInterval,它就会变为应用程序错误,返回503服务不可用。请帮忙!

我的代码:

var express = require('express');
var request = require('request');
var app = express();
var options = {
    url: 'myURL.com',
    headers: {
        'X-API-KEY': 'key',
        'Accept': 'application/json'
    }
};

app.use(express.static('public'));

function getData() {
    app.get('/', function (req, res) {
        request(options, function (error, response, body) {
            if (!error && response.statuscode == 200) {
                res.send(extractinfo(json.parse(body)));
            } else if (!error) {
                res.status(response.statuscode).send([]);
            } else {
                res.send([]);
            }
        });
    });
}
setInterval(getData, 1000*60*60);    

编辑:我的请求将在正文中返回JSON(如果我没有setInterval,它会返回)。

[  
   {  
      "Course_Schedule_ID":"20",
      "Course_Name":"History of Music",
      "Start_Date":"2016-02-16",
      "Start_Time":"19:30:00"
   },
   {  
      "Course_Schedule_ID":"21",
      "Course_Name":"Science Discovery",
      "Start_Date":"2016-02-21",
      "Start_Time":"14:00:00" 
   }
]

1 个答案:

答案 0 :(得分:0)

您只需要设置一次服务。您应该只在应用程序启动时拨打app.get('/', ...)个电话,而不是每小时拨打一次电话。

app.get侦听器提供最新版本的数据,并使用单独的代码更新最新数据。

var latestData = {
    data: [],
    status: 200
};

app.get('/', function (req, res) {
    res.status(latestData.status).send(latestData.data);
});

// update outer latestData
function getData(callback) {
    request(options, function (error, response, body) {
        if (!error && response.statuscode == 200) {
            latestData = {
                data: extractinfo(json.parse(body)),
                status: 200
            };
        } else if (!error) {
            latestData = {
                data: [],
                status: response.statuscode
            };
        } else {
            latestData = {
                data: [],
                status: 200
            };
        }

    });
}
setInterval(getData, 1000*60*60);

// call `getData` immediately so we don't wait an hour for real data
getData();