`agenda.js` 如何计算 `every()` 操作的时区

Mui*_*rik 0 mongodb node.js agenda

agenda.js在我的 Node 项目中使用它,由 MongoDB 数据库支持,来处理我们需要运行的批处理过程。这运作良好。不过,我确实有一个关于时区的问题。当我使用该every()操作时,它似乎接受作业名称和时间表。所以我一直在数据库中播种作业,如下所示:

  for (let job of dbJobs) {
    await agenda.every(schedule, job.name);
  }
Run Code Online (Sandbox Code Playgroud)

请注意,上面的内容schedule采用 cron 格式 - 00 05 * * 1-5

这有效。然而,据我所知,every()不接受 的争论repeatTimezone。那么在这些情况下它是如何计算时区的呢?

澄清一下,当我使用 添加作业后查看数据库中的文档时every(),该repeatTimezone属性存在,但其值设置为null

其他agenda操作(例如repeatEvery()确实接受时区参数,如下所示:

job.repeatEvery('0 6 * * *', {
  timezone: 'America/New_York'
});
Run Code Online (Sandbox Code Playgroud)

自从我使用 以来every(),我一直通过首先使用 播种数据库every(),然后运行 ​​MongoupdateMany()将 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,即使我没有像我这样做时那样明确地将属性值添加到作业中,agenda似乎也会计算相同的时间。repeatTimezone

这里发生了什么我不明白的事情?运行时间是如何计算的every(),有没有办法传入时区?

仅供参考:我与需要在数据库中设置的时区不在同一时区。

Shi*_*ood 6

您的问题似乎分为两部分,我不确定我能否很好地解释它,但让我尝试一下

所以,你的第一个问题

但是,据我所知,every()不接受时区的争论

从技术上讲,您也可以添加Timezone选项,因为此方法的作用是内部调用,并且您已经知道可以添加该选项。为了支持我的答案,我找到了2个证据every()job.repeatEverytimezone

  1. 来自文档asevery接受 4 个参数

每个(间隔,名称,[数据],[选项])

options是一个可选参数,将传递给job.repeatEvery. 为了使用此参数,还必须指定数据。

所以如果你也通过的话技术上也可以通过timezonedata

  1. SourceCode中,您可以看到它们job.repeatEvery(interval, options)在内部使用。

现在,回答你的第二个问题

在这些情况下它是如何计算时区的?

嗯,他们有一个非常独特但必需的模块,名为ComputeNextRunAt()

所以我浏览了他们的源代码,发现这是根据startingTime和Interval来计算你的工作下一次运行的时间。

您的代码之所以有效,是因为您在工作中曾经(最初)提到过遵循America/New_York时区,因此每个下一个工作间隔都是基于此计算的,这就是您不需要再次指定它的原因。

因此,如果最初您没有指定时区属性,您会得到您的时区属性local Timezone,但现在您这样做了,它会根据该属性计算下一个间隔。

  • 不用担心!PS-这是“Shivam”而不是“Shivram” (3认同)