我在我的Node项目中使用agenda.js来处理我们需要运行的批处理过程,该项目有一个MongoDB数据库支持。效果很好。不过,我确实有一个关于时区的问题。当我使用every()操作时,它似乎接受作业名称和计划。因此,我一直在数据库中播种作业,如下所示:
for (let job of dbJobs) {
await agenda.every(schedule, job.name);
}请注意,对于上面的内容,schedule是cron格式- 00 05 * * 1-5。
这个很管用。然而,据我所知,every()不接受repeatTimezone的论点。那么,在这种情况下,它如何计算时区呢?
为了澄清,在使用every()添加作业之后,当我查看数据库中的文档时,repeatTimezone属性是存在的,但是它的值被设置为null。
其他agenda操作,如repeatEvery(),确实接受时区参数,如下所示:
job.repeatEvery('0 6 * * *', {
timezone: 'America/New_York'
});自从我使用every()以来,我一直在管理这个问题,首先使用every()播种数据库,然后运行Mongo updateMany()将timzeone显式地添加到所有作业中:
async function addTimezoneToJobs() {
try {
const db = await client.db(dbName);
await db.collection('batch_processes').updateMany({}, {
$set: {
repeatTimezone: 'America/New_York'
}
});
} catch (error) {
console.log(error);
}
}但奇怪的是,即使我没有显式地将repeatTimezone属性值添加到作业中,repeatTimezone似乎也会计算相同的时间。
这里发生了什么我不明白的事?如何使用every()计算运行时,以及是否有一种传递时区的方法?
FYI:我不在需要在db中设置的同一时区。
发布于 2019-11-14 15:37:42
你的问题似乎有两个部分,我不确定我能否解释得很好,但让我试试
所以,你的第一个问题
然而,据我所知,
every()不接受Timezone的论点
从技术上讲,您也可以将Timezone选项添加到every()中,因为该方法所做的是在内部调用job.repeatEvery,正如您已经知道的,您可以将timezone添加到其中。为了支持我的回答,我找到了两个证据
every接受4个参数每个(间隔、名称、数据、选项)
options都是一个可选的参数,将传递给job.repeatEvery。为了使用此参数,还必须指定数据。
因此,您可以从技术上 pass timezone,如果您也通过data
job.repeatEvery(interval, options)。现在,关于你的第二个问题
在这种情况下,它如何计算时区?
嗯,他们有一个非常独特但必需的模块,名为ComputeNextRunAt()。
因此,我检查了他们的源代码,并指出这是计算什么时候将是您的工作下一次运行基于startingTime和间隔。
您的代码之所以有效,是因为您在作业中提到过一次(最初)遵循America/New_York时区,因此每个下一个作业间隔都是基于此计算的,这就是不需要再次指定它的原因。
因此,如果最初您还没有指定时区属性,那么您本来可以得到local Timezone,但是现在您已经这样做了,它将根据这一点计算下一个时间间隔。
https://stackoverflow.com/questions/58858574
复制相似问题