Node.js Cron作业与日期对象混淆

时间:2012-06-28 01:52:37

标签: node.js cron express

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

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:\节点\ W \ WebRole1 \公共\ Javascript角\ date.js:56 onsole.log( 'isDST'); return 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)     at Object._getNextDateFrom(C:\ node \ w \ WebRole1 \ node_modules \ cron \ lib \ cron.js:88:30)     at Object.sendAt(C:\ node \ w \ WebRole1 \ node_modules \ cron \ lib \ cron.js:51:17)     at Object.getTimeout(C:\ node \ w \ WebRole1 \ node_modules \ cron \ lib \ cron.js:58:30)     at Object.start(C:\ node \ w \ WebRole1 \ node_modules \ cron \ lib \ cron.js:279:33)     在C:\ node \ w \ WebRole1 \ server.js:169:46     at 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文件中使用此行:

要求( '../公共/ Javascript角/日期');

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

在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模块有关吗?

任何人都看错了。

欢呼声

1 个答案:

答案 0 :(得分:0)

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

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

  

是正确的,我只需要这样做一次,因为date.js是全局的吗?

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