2017-02-28 73 views
0

我有我的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做到這一點,但我想知道在我的代碼應用程序中是否有其他方式是正確的? –

回答

3

在你的問題的關鍵詞是「 自動'。在服務器上的特定時間運行腳本的最簡單(也是最可靠的)方法是在服務器上使用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在後臺運行,因爲它是客戶端語言。

希望這會有所幫助! :)

1

您可以使用節點模塊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'); 
}); 
相關問題