【问题标题】:How to validate cron-expression with giiven limit?如何使用给定限制验证 cron 表达式?
【发布时间】:2020-11-02 06:30:44
【问题描述】:

我需要构建一个 cron-validator。 这是一个 cron 表达式,意思是每 30 秒一次。

*/30 * * * * *

任务是在时间少于 30 秒时显示错误。 例子: 因此,如果我写以下内容,也就是说,每 10 秒,

*/10 * * * * *

它应该显示一条错误消息“请输入超过 30 秒”。 这是示例函数,表达式是 cron 表达式,限制以毫秒为单位,所以如果我通过 30 秒,它应该验证 30 秒。

function cronValidator(expression = '', limit = 30000){}

到目前为止,我已经尝试过:

function cronValidator(expression = '', limit = 30000) {
  // filter the number of seconds from expression
  const [seconds] = expression.match(/(\d+)/);
  // convert seconds into miliseconds
  const milisecondsInExpression = seconds * 1000;

  if (milisecondsInExpression < limit) {
    console.error(`Please enter more than ${limit / 1000} seconds.`);
  } else {
    console.log('You are good to go.');
  }
}

const cronExp = '*/31 * * * * *';

cronValidator(cronExp, 40000);

但它不起作用,原因:

  • 限制或表达式可以是分钟或小时。不只是几秒钟。这意味着普通的正则表达式是不够的。

【问题讨论】:

  • 不是每 30 秒,而是每 30 分钟。
  • Crontab 只有分钟粒度,没有秒数。
  • 只有 5 个时间字段:分钟、小时、天、月、工作日。
  • 请验证您的 cron 表达式是否有效。你可以在这里查看crontab.guru

标签: javascript node.js cron cron-task


【解决方案1】:

将输入拆分为空格分隔的字段,并仅验证第一个字段。如果频率为*/#,则应仅检查频率。

let fields = expression.split(/\s+/);
let seconds = fields[0];
let split_seconds = seconds.match(/^\*\/(\d+)$);
if (split_seconds) {
    let milliseconds = split_seconds[1] * 1000;
    if (milliseconds < limit) {
        console.error(`Please enter more than ${limit / 1000} seconds.`);
    }
}

【讨论】:

  • 但限制也可以是小时、天、分钟......不仅仅是毫秒。
  • 我以为你只是想限制秒数。
  • 如果他们分开时间,那就是超过30秒,所以应该没有必要限制它。
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2023-03-25
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多