NestJS Schedule使用问题:已删除的测试Cron任务仍每日0点执行
NestJS Schedule使用问题:已删除的测试Cron任务仍每日0点执行
这种情况确实挺闹心的——明明已经把测试用的定时任务从代码里删得一干二净了,结果它还每天准点在0点触发,翻遍整个项目都找不到它的踪迹对吧?我来给你分析几个大概率的原因,以及对应的解决办法:
常见原因及解决步骤
进程残留导致旧代码继续运行
很多时候是之前启动的服务进程没彻底终止,后台还在偷偷跑着旧版本的代码。你可以:- Windows:打开任务管理器,找到所有
node.exe进程,全部结束掉 - Linux/Mac:在终端执行
ps aux | grep node找到相关进程,用kill -9 [进程ID]彻底杀死
之后再重新启动服务,看看0点的任务还会不会触发。
- Windows:打开任务管理器,找到所有
模块/热重载缓存搞的鬼
NestJS的热重载或者Node.js的模块缓存,可能会让旧的任务代码留在内存里。试试这些操作:- 关闭当前的开发服务,删除项目根目录下的
dist文件夹(如果有的话),重新编译启动 - 启动服务时加上
--no-cache参数,比如nest start --watch --no-cache,禁用模块缓存 - 甚至可以重启你的IDE,有时候IDE的缓存也会影响代码的实际运行效果
- 关闭当前的开发服务,删除项目根目录下的
检查非代码层面的任务配置
有没有可能测试任务不是写在业务代码里,而是放在了配置文件或者外部存储中?比如:- 检查
.env文件里有没有定义过Cron表达式的变量,或者配置模块里有没有动态加载定时任务的逻辑 - 如果你的项目是用数据库/Redis存储动态定时任务的,去看看里面是不是还留着那个0点任务的配置
- 检查
用代码排查已注册的任务
最直接的方式是在服务启动时,打印出所有已注册的Cron任务,这样就能确认那个0点任务到底是不是还在列表里。可以在任意一个服务里注入SchedulerRegistry来实现:import { Injectable, OnModuleInit } from '@nestjs/common'; import { SchedulerRegistry } from '@nestjs/schedule'; @Injectable() export class TaskCheckService implements OnModuleInit { constructor(private readonly schedulerRegistry: SchedulerRegistry) {} onModuleInit() { // 打印所有已注册的Cron任务 const cronJobs = this.schedulerRegistry.getCronJobs(); cronJobs.forEach((job, jobName) => { console.log(`已注册的Cron任务:${jobName},表达式:${job.cronTime.source}`); }); } }启动服务后看控制台输出,如果能看到那个0点的任务,就能顺着任务名称找到它的注册位置了。
最后再提个小建议
如果以上方法都试过还是没解决,可以检查下@nestjs/schedule的版本,确保它和@nestjs/common的版本是兼容的(比如都是10.x系列),有时候版本不匹配也可能出现奇怪的缓存问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

