我在我的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()
,do 接受一个timezone参数,如下所示:
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
属性值添加到作业中,agenda
计算的时间似乎也与添加时相同。
这里发生了什么我不明白的事情?如何用every()
计算运行时,有没有办法传入时区?
仅供参考:我与需要在数据库中设置的时区不在同一时区。
1条答案
按热度按时间ar7v8xwq1#
你的问题似乎是两部分,我不太确定我能解释得很好,但让我试试
所以你的第一个问题
但是,据我所知,
every()
不接受Timezone参数从技术上讲,您也可以将
Timezone
选项添加到every()
,因为此方法的作用是在内部调用job.repeatEvery
,并且您已经知道,您可以将timezone
添加到该函数。1.来自文档,因为
every
接受4个参数every(间隔,名称,[数据],[选项])
options
是将传递给job.repeatEvery
的可选参数。要使用此参数,还必须指定数据。因此,如果您也通过了
data
,则技术上可以通过timezone
1.在源代码中,您可以看到他们在内部使用
job.repeatEvery(interval, options)
。现在回到你的第二个问题
在这些情况下,它如何计算时区?
他们有一个非常独特但必需的模块,名为ComputeNextRunAt()。
所以我浏览了他们的源代码,发现这是为了根据startingTime和Interval计算你的作业下一次运行的时间。
您的代码之所以有效,是因为您曾经(最初)在作业中提到要遵循
America/New_York
时区,因此每个下一个作业间隔都是基于此计算的,这就是您不需要再次指定它的原因。因此,如果最初您没有指定timezone属性,您将获得您的
local Timezone
,但现在您这样做了,它将基于此计算下一个时间间隔。