【问题标题】:Running a function everyday midnight每天午夜运行一个函数
【发布时间】:2014-12-06 00:24:27
【问题描述】:
walk.on('dir', function (dir, stat) {
    uploadDir.push(dir);
});

我正在使用Node,我需要让这个功能每天午夜运行,这可能吗?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

我相信the node-schedule package 会满足您的需求。通常,您希望所谓的cron 来安排和运行您的服务器任务。

使用节点调度

import schedule from 'node-schedule'

schedule.scheduleJob('0 0 * * *', () => { ... }) // run everyday at midnight

【讨论】:

  • 谢谢!我不知道为什么,但是这个包正在工作,而其他包却没有。
  • 我们需要每天启动它吗?还是自动启动?
  • 注意,node-schedule 可能会满足您的需求。我刚刚发现我们的项目只在 setTimeout 的一个地方使用了它,它在 v1.3.2 中添加了 1.1MB 的缩小 JavaScript(!)。当然,v2 大约是大小的 10%。反正setInterval/setTimeout能用的话还是值得考虑的。
【解决方案2】:

我使用以下代码:

function resetAtMidnight() {
    var now = new Date();
    var night = new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate() + 1, // the next day, ...
        0, 0, 0 // ...at 00:00:00 hours
    );
    var msToMidnight = night.getTime() - now.getTime();

    setTimeout(function() {
        reset();              //      <-- This is the function being called at midnight.
        resetAtMidnight();    //      Then, reset again next midnight.
    }, msToMidnight);
}

我认为在午夜运行函数有合法的用例。例如,就我而言,我在网站上显示了许多每日统计数据。如果网站恰好在午夜打开,则需要重置这些统计信息。

另外,感谢this 的回答。

【讨论】:

  • 我喜欢这个答案,但是它有一个问题:跨越数月甚至数年时它没有得到正确的日期。您可能想用let night = now; night.setDate(new Date().getDate()+1); night.setHours(0, 0, 0) 替换night 定义。这解决了这个问题。
【解决方案3】:

这个node-schedule 有一个节点包。

你可以这样做:

var j = schedule.scheduleJob({hour: 00, minute: 00}, function(){
    walk.on('dir', function (dir, stat) {
       uploadDir.push(dir);
    });
});

欲了解更多信息,请参阅here

【讨论】:

    【解决方案4】:

    这是其他一些长期运行过程的一部分吗?真的需要吗?如果是我,我只会写一个快速运行的脚本,使用常规的旧 cron 来安排它,然后当进程完成时,终止它。

    有时,将此类计划任务构建到正在执行其他操作(我自己已经完成)的其他长时间运行的进程中是有意义的,在这些情况下,其他答案中提到的库是您的最好的选择,或者您总是可以编写一个setTimeout()setInterval() 循环来为您检查时间并在时间匹配时运行您的进程。但在大多数情况下,由 cron 启动的单独脚本和单独进程才是您真正需要的。

    【讨论】:

    • 我遇到了一些问题,我无法使用 schedule 包或 setTimeout()...两者都不起作用..
    • @Nescau - 你为什么不能使用计划包或setTimeout()。两者都应该工作正常。你必须帮助我们帮助你。
    • 问题不在于计划任务是否需要很长时间,而在于您是否需要它成为更大的包含持久性进程的一部分,或者它是否是自包含的。您是否需要节点运行并做其他事情以准备您的计划任务在午夜运行?或者你可以在午夜启动你的进程,然后在它完成后终止它,只是为了在下一个午夜再次启动它?一般来说,这类事情属于后一类。
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 2015-09-17
    • 2012-08-09
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2016-01-02
    相关资源
    最近更新 更多