我的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
答案 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');
});