2016-04-28 78 views
7

我已經編寫了一個NodeJS應用程序,該應用程序僅在工作日的特定時間調用API併發布到端點。如何讓我的NodeJS應用程序永遠運行在循環中

我可以設置一個cron作業來在指定的時間運行應用程序,但是我寧願使用node index.js來運行它,並讓它運行不斷,直到正確的日期和時間纔會運行,然後返回到「睡眠「直到第二天。

我該如何做到這一點?我嘗試了一段時間循環:

while (true) { 
    myApp.run(); 
} 

很明顯,這並沒有太好。

什麼是正確的做法?我是否應該重寫我的模塊以使用事件,以便在時間到時發出一個事件,並且有一個響應它的偵聽器?

--edit:爲了更具體一些,我希望它以類似的方式運行,其中包含一個Web服務器的應用程序。當你啓動應用程序時,它正在運行並等待連接;它在連接結束時請求&不會退出,它仍在運行,正在等待更多請求&連接。

--edit 2:我寧願不使用cron的原因是因爲運行的日期和時間可以在應用程序解析的config.json文件中配置。我寧願避免與cron混淆,只需通過編輯config.json文件來更改計劃。

- 編輯3:我想自己編碼而不使用模塊。當我試圖編寫一個永久運行的應用程序時,我的大腦總是很痛,我想了解它是如何完成的,而不是使用模塊。

--edit 4:這裏是我最終使用:

function doStuff() { 
    // code to run 
}; 

function run() { 
    setInterval(doStuff, 30000); 
}; 

run(); 
+0

沒有太多的節點人,但我想它有某種你可以設置的計時器。我會使用其中之一。 –

+1

我喜歡cron或類似[resque](https://github.com/taskrabbit/node-resque)這樣的工作計劃程序會更好。你總是可以使用['setInterval'](https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_arg) –

+0

你可以得到當前的日期和時間,然後計算下一次你想要的時間調用你的API。然後在調用'setTimeout()'或'setInterval()'(如上面的Nick Tomlin所述)時使用該時間間隔 – RJM

回答

0

你可以試試這個工具https://www.npmjs.com/package/forever。這是非常簡單的使用方法:

只是forever start app.js運行腳本,

+0

這是行不通的,因爲我的腳本沒有在循環中運行,所以它會每500毫秒死亡一次,永遠重新啓動它。 – springloaded

0

可以使用cron模塊。而且您可以從配置文件中加載時間和數據,而不用在代碼中進行硬編碼。

例子:

var CronJob = require('cron').CronJob; 
var job = new CronJob({ 
    cronTime: '00 30 11 * * 1-5', 
    onTick: function() { 
    /* 
    * Runs every weekday (Monday through Friday) 
    * at 11:30:00 AM. It does not run on Saturday 
    * or Sunday. 
    */ 
    }, 
    start: false, 
    timeZone: 'America/Los_Angeles' 
}); 
job.start(); 
+0

謝謝,但我想自己做這件事,沒有一個模塊來試圖瞭解它是如何完成的。我努力的事情就是理解像express這樣的事情是否有一個始終運行並等待傳入​​請求的進程 – springloaded

+0

表達方式與您希望在此處實現的完全不同@springloaded啓動HTTP服務器並等待請求。 – AJS

+0

可能是這有助於查看源代碼:https://github.com/nodejs/node/blob/master/lib/_http_server.js#L429 – AJS

2

以及你總是可以用一個簡單的setInterval

function execute(){ 
    //code to execute 

} 


setInterval(execute,<calculate time interval in milliseconds you want to execute after>); 

這是做一個非常裸機基本途徑。希望這可以幫助。

+0

這會導致內存不足 – springloaded

+0

您設置的時間間隔是多少至? – AJS

+0

我認爲你已經將你的間隔設置得非常低,因爲在我的測試中它從來沒有給出任何問題,如果它運行無窮大,總是嘗試在1秒或更長的時間間隔。 – AJS

0

因此,這裏是我如何解決它,爲@AJS建議:

function myApp() { 
    while (!isItTimeYet) { 
    setInterval(myApp, 59000); 
    } 
} 

這是比我想象的簡單,希望它不會泄露內存。

--edit:這是錯誤的並且泄漏內存,因爲每個循環都會使其更深一層。這是方式:

function doStuff() { 
    // code to run 
}; 

function run() { 
    setInterval(doStuff, 30000); 
}; 

run(); 
+0

但是,您是不是每次創建新的時間間隔?我認爲你也......設定的時間間隔應該足夠了。 –

+0

是的,這是錯誤的,因爲它遞歸地調用setInterval中設置setInterval的函數。我想我試了一下,我很累。 – springloaded

+0

只需簡單地按照我的回答 – AJS

相關問題