0

我刚开始使用 cron,但我找不到安排一次性工作的方法。我所拥有的对我有用,但我想知道是否有更好的方法来实现它。

下面的代码创建一个作业并在控制台中打印出它的创建。我每 1 秒设置一次计时器,但就在下面我用 1.5 秒睡眠来停止工作。

const express = require('express');
const cron = require('node-cron');
const router = express.Router();

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

// Schedule a job on GET
router.get('/', (req, res, next) => {
  const job = cron.schedule(`*/1 * * * * *`, () => {
    console.log('job created');
  });
  sleep(1500).then(() => {
    job.stop();
  })
  
  return res.status(200).json({ message: 'scheduled'});
});
4

2 回答 2

2

您可以构建 cron 表达式,如下所示。"0 0 7 8 9 ? 2020" (seconds min hour dayOfMonth Month DayofWeek Year) ,这只会运行一次。您需要根据希望作业运行的第一天/时间来构建此表达式。如果需要立即运行,可以根据当前时间+几秒缓冲区构建cron表达式

于 2020-09-07T22:39:10.067 回答
0

正如snp 所建议的,我必须创建一个最近的日期加上几秒钟的 cron 表达式。而且,我意识到包裹node-cron与 . 完全不同cron,即使它们重定向到同一个地方。

我是这样解决的:

const express = require('express');
const cron = require('cron'); // <- change of package
const router = express.Router();
const cronJob = cron.CronJob; // <- get the cron job from the package

const getDateAsCronExpression = () => { ... }

// Schedule a job on GET
router.get('/', (req, res, next) => {
  const cronExpression = getDateAsCronExpression();
  var job = new cronJob(cronExpression, () => {
    console.log('job executed!');
  }, null, true, 'your_time_zone_here');
  
  return res.status(200).json({ message: 'scheduled'});
});

于 2020-09-07T23:11:40.093 回答