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

问题描述:

我有我的Node.js应用程序使用Fixer.io API获取一些数据。目前该电话是在我到达URL myapp/rate时进行的。我的目标是每天两次自动进行此调用,以将数据存储在我的MongoDB数据库中。定期(每天两次)从Node.js调用API获取数据的最佳方式

所以我想知道什么是最好的方法来做到这一点?也许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'); 
    }); 
}); 

感谢的

+0

脚本自动运行在特定时间的最佳方式是使用cronjobs。你有访问他们吗? –

+0

@ObsidianAge当然,我可以用cronjobs做到这一点,但我想知道在我的代码应用程序中是否有其他方式是正确的? –

在你的问题的关键词是“ 自动'。在服务器上的特定时间运行脚本的最简单(也是最可靠的)方法是在服务器上使用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); 

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

请记住,这只适用于应用程序永久运行加载JavaScript的页面;没有办法强制JavaScript在后台运行,因为它是客户端语言。

希望这会有所帮助! :)

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

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