【问题标题】:Node.js Cron Job Messing with Date ObjectNode.js Cron 作业与日期对象混淆
【发布时间】:2012-07-12 05:22:55
【问题描述】:

我正在尝试安排几个 cron 作业来为我的网络应用程序中的不同实体生成序列号。但是我遇到了这个问题,当我循环每个表时,它说它与 date.js 有关。我没有对日期对象做任何事情?反正不在这个阶段。有几个猜测是 cron 对象在其代码中执行日期操作并引用 date.js。我正在使用 date.js 来访问诸如 ISO 日期之类的内容。

for (t in config.generatorTables) {
    console.log("t = " + config.generatorTables[t] + "\n\n");

    var ts3 = azure.createTableService();
    var jobSerialNumbers = new cronJob({
        //cronTime: '*/' + rndNumber + ' * * * * *',
        cronTime: '*/1 * * * * *',
        onTick: function () {
            //console.log(new Date() + " calling topUpSerialNumbers \n\n");
            manageSerialNumbers.topUpSerialNumbers(config.generatorTables[t], function () { });
        },
        start: false,
        timeZone: "America/Los_Angeles"
    });

    ts3.createTableIfNotExists(config.generatorTables[t], function (error) {
        if (error === null) {
            var query = azure.TableQuery
                .select()
                .from(config.generatorTables[t])
                .where('PartitionKey eq ?', '0')

            ts3.queryEntities(query, function (error, serialNumberEntities) {
                if (error === null && serialNumberEntities.length == 0) {
                    manageSerialNumbers.generateNewNumbers(config.maxNumber, config.serialNumberSize, config.generatorTables[t], function () {
                        jobSerialNumbers.start();
                    });
                }
                else jobSerialNumbers.start();
            });
        }
    });
}

这是我在检查 server.js.logs\0.txt 文件时收到的错误消息:

C:\node\w\WebRole1\public\javascripts\date.js:56 onsole.log('isDST');返回 this.toString().match(/(E|C|M|P)(S|D)T/)[2] == "D" ^ TypeError:无法读取 null 的属性“2” 在 Date.isDST (C:\node\w\WebRole1\public\javascripts\date.js:56:110) 在 Date.getTimezone (C:\node\w\WebRole1\public\javascripts\date.js:56:228) 在 Object._getNextDateFrom (C:\node\w\WebRole1\node_modules\cron\lib\cron.js:88:30) 在 Object.sendAt (C:\node\w\WebRole1\node_modules\cron\lib\cron.js:51:17) 在 Object.getTimeout (C:\node\w\WebRole1\node_modules\cron\lib\cron.js:58:30) 在 Object.start (C:\node\w\WebRole1\node_modules\cron\lib\cron.js:279:33) 在 C:\node\w\WebRole1\server.js:169:46 在 Object.generateNewNumbers (C:\node\w\WebRole1\utils\manageSerialNumbers.js:106:5) 在 C:\node\w\WebRole1\server.js:168:45 在 C:\node\w\WebRole1\node_modules\azure\lib\services\table\tableservice.js:485:7

我在我的 database.js 文件中使用了这一行:

要求('../public/javascripts/date');

因为 date.js 是全局的,所以我只需要执行一次是正确的吗? IE。它有一堆内置日期对象的原型(扩展)。

在 manageSerialNumbers.js 中,我只是在做一个回调,它们没有执行代码,因为我已经全部注释掉了,但仍然收到此错误。

任何帮助或建议将不胜感激。

好的,我已经注释掉了 date.js 模块,现在我收到了这个错误:

您指定了时区,但未包含 time 模块。时区功能被禁用。请安装 time 模块以在您的应用程序中使用时区。

当我检查 cron.js 模块时,它的顶部有以下语句:

var CronDate = Date;
try {
  CronDate = require("time").Date;
} catch(e) {
  //no time module...leave CronDate alone. :)
}

所以这会得出结论,它确实与 date.js 模块有关?

任何人都知道出了什么问题。

干杯

【问题讨论】:

    标签: node.js cron express


    【解决方案1】:

    我用了一段时间的 date.js,然后意识到 Node.js/V8 中的 Date 对象已经有了 ISO 支持,输入和输出,而 Date.js 只是添加了一个非常具体的边缘情况。你到底需要 date.js 做什么?

    如果你确实需要 date.js...

    因为 date.js 是全局的,所以我只需要执行一次是正确的吗?

    只要代码在同一个进程中运行,就是这样。我不熟悉 Azure 上的 Node.js,或者提供您正在使用的 cronJob 方法的库,但也许它会产生一个新进程,它有自己的 V8 实例,然后您会丢失 Date 对象更改? (所以require 再次在该代码中。)

    【讨论】:

      猜你喜欢
      • 2015-06-26
      • 2018-10-05
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多