从Node.js定期(每天两次)调用API以获取数据的最佳方法

时间:2017-02-28 21:15:47

标签: javascript node.js mongodb api automation

我的Node.js应用程序使用Fixer.io API来获取一些数据。目前,当我到达网址myapp/rate时,会进行通话。我的目标是每天自动拨打两次电话,将数据存储在MongoDB数据库中。

所以我想知道最好的方法是什么?也许setInterval()是唯一的方法,但我不这么认为......

我的电话如下:

router.get('/', (req, res, next) => {
  fixer.latest({ base: 'EUR', symbols: ['CAD'] })
    .then((data) => {
      var currentData = data.rates;
      if (currentData) {
        const currentRate = new Rate({ rate: currentData.CAD });
        currentRate.save((err) => {
          if (err) {
            throw err;
          } else {
            console.log('Data saved successfully!');
          }
        });
      }
    })
    .then(() => {
      Rate.find({}, { rate: 1, _id: 0 }, (err, rates) => {
        if (err) {
          throw err;
        } else {
          res.json(rates);
        }
      });
    })
    .catch(() => {
      console.log('Error');
    });
});

感谢' S

2 个答案:

答案 0 :(得分:2)

您问题中的关键字是“自动”。在服务器上的特定时间运行脚本的最简单(也是最可靠)的方法是在服务器上使用cronjobs。这样,无论用户交互如何,您的服务器都将执行脚本:

0   0   *   *   *   TheCommand // 12 a.m.
0   12   *   *   *   TheCommand //  12 p.m.

但是,也可以按照您的想法使用JavaScript setTimeout()在特定时间运行脚本。您需要计算当前时间,目标时间以及它们之间的差异:

var now = new Date();
var payload = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 12, 0, 0, 0) - now;
if (payload < 0) {
     payload += 46400000; // Try again 12 hours later
}
setTimeout(function(){ // YOUR DESIRED FUNCTION }, payload);

请注意payload中的上述12是您希望脚本运行的小时。在这个例子中,我在下午12点运行脚本。和上午12点。

请注意,这只有在应用程序永久运行加载JavaScript的页面时才有效;没有办法强迫JavaScript在后台运行,因为它是一种客户端语言。

希望这有帮助! :)

答案 1 :(得分:2)

您可以使用节点模块node-schedule以类似cron的计划在节点应用程序中运行任务。

var schedule = require('node-schedule');

var j = schedule.scheduleJob('0 0 0,12 * *', function(){
  console.log('This will run twice per day, midnight, and midday');
});