mongodb agenda.js“如何计算”every()"运算的时区

vxf3dgd4  于 2023-01-04  发布在  Go
关注(0)|答案(1)|浏览(114)

我在我的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()计算运行时,有没有办法传入时区?
仅供参考:我与需要在数据库中设置的时区不在同一时区。

ar7v8xwq

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,但现在您这样做了,它将基于此计算下一个时间间隔。

相关问题