Javascript can';t使用节点cron停止cron作业

Javascript can';t使用节点cron停止cron作业,javascript,node.js,cron,Javascript,Node.js,Cron,目前我正在使用node cron包来安排任务。我可以让任务运行,但我不能让它停止 我的帖子是: { command: start/stop/destroy, } 代码是: export const schedule = async (req, res) => { const cmd = req.body.command const url_taskMap = {} // run every midnight GMT+7 const task = awa

目前我正在使用node cron包来安排任务。我可以让任务运行,但我不能让它停止

我的帖子是:

{
command: start/stop/destroy, 
}
代码是:

export const schedule = async (req, res) => {
    const cmd = req.body.command
    const url_taskMap = {}

    // run every midnight GMT+7
    const task = await cron.schedule(process.env.SCHEDULE_TIME, () => {
        console.log('doing task');
    }, {
        scheduled: true,
        timezone: "Asia/Bangkok"
    })

    url_taskMap['url'] = task;
    let my_job = url_taskMap['url'];


    if (cmd === 'start') {
        my_job.start()
        res.status(200).send('Task started!')
    } else if (cmd === 'stop') {
        my_job.stop()
        res.status(200).send('Task stoped!')
    } else {
        my_job.destroy()
        res.status(200).send('Task destroyed!')
    }
}

我在这里遵循答案,但任务仍在运行。我不知道如何让它停止。你能帮我吗?

我对node cron不是很熟悉,但这段代码似乎有几个问题,主要问题是每个请求都会创建一个新作业,这意味着,例如,第一个请求(cmd:'start')启动一个作业,然后下一个请求(cmd:'stop'))创建另一个作业,然后在第一个作业继续运行时停止该另一个作业

为了克服这个问题,我们需要确保只有一个作业实例(最多)将运行,并且当我们想要停止它时,我们实际上正在停止该实例

这可以通过持久化运行的作业来实现,在运行新作业之前,首先检查是否没有正在运行的作业


第二个问题是,如果我理解正确,“stop”(停止)将停止任务的调度,因此,例如,如果一个任务计划每分钟运行一次,并且调用了
task.stop()
,则下一分钟不会再次调用该任务。这并不意味着以前运行的任务中的代码将停止执行!例如,如果您的代码有一个无限循环,停止任务不会创建更多正在运行的代码实例,但是已经开始运行的实例将永远运行。这意味着您有责任确保代码完成运行

我发现,我需要将任务移动到外部函数,然后才能停止它。