diff --git a/back/schedule/delCron.ts b/back/schedule/delCron.ts index 6e35c080..f711deea 100644 --- a/back/schedule/delCron.ts +++ b/back/schedule/delCron.ts @@ -13,7 +13,20 @@ const delCron = ( '[schedule][取消定时任务] 任务ID: %s', id, ); - scheduleStacks.get(id)?.forEach(x => x.cancel()); + // 过滤掉 nodeSchedule.scheduleJob() 对无效表达式返回的 null, + // 否则对 null 调 cancel() 会让整个取消流程抛出 UNKNOWN 错误, + // 进而导致 HTTP 端的 remove() 跳过 setCrontab(),造成 crontab.list 残留。 + scheduleStacks.get(id)?.filter((x) => x != null).forEach((x) => { + try { + x.cancel(); + } catch (error: any) { + Logger.warn( + '[schedule][取消任务失败] 任务ID: %s, 错误: %s', + id, + error?.message || error, + ); + } + }); scheduleStacks.delete(id); } }