定期(每天两次)从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');
});
});
感谢的
答
在你的问题的关键词是“ 自动'。在服务器上的特定时间运行脚本的最简单(也是最可靠的)方法是在服务器上使用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');
});
脚本自动运行在特定时间的最佳方式是使用cronjobs。你有访问他们吗? –
@ObsidianAge当然,我可以用cronjobs做到这一点,但我想知道在我的代码应用程序中是否有其他方式是正确的? –