2016-04-28 43 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

相关问题