node-cron仅初始执行app.js,定时间隔不执行脚本问题排查
问题分析与修复方案
你遇到的问题主要来自两个关键错误:
1. Node.js模块缓存导致app.js仅执行一次
当你在cron回调里使用require('./app.js')时,Node.js会在第一次加载模块后自动缓存它。后续的require调用不会重新执行app.js里的顶层代码,只会返回之前缓存的模块对象。这就是为什么第一次触发定时任务时app.js正常执行(出现了retweet相关日志),但之后只有console.log输出的核心原因。
2. 定义了commandList但未实际执行命令
你代码里的commandList = [ "node app.js" ]只是定义了一个数组,但完全没有调用任何方法来执行这个命令,所以这行代码根本起不到运行app.js的作用。
修复后的代码示例
要真正让每次定时任务触发时都执行app.js,你需要用Node.js的child_process模块来启动新进程执行脚本,而不是依赖require。这里推荐使用child_process.exec:
const cron = require('node-cron'); const { exec } = require('child_process'); cron.schedule('*/10 * * * * *', function(){ // 执行node app.js命令 exec('node app.js', (error, stdout, stderr) => { if (error) { console.error(`执行出错: ${error.message}`); return; } if (stderr) { console.error(`错误输出: ${stderr}`); return; } console.log('Bot successfully executed'); console.log(`脚本输出: ${stdout}`); }); });
额外说明
- 如果你需要更精细化的进程控制(比如实时输出日志),可以使用
child_process.spawn代替exec。 - 确保
app.js的路径正确,如果和当前脚本不在同一目录,要使用绝对路径或者相对正确的路径。
内容的提问来源于stack exchange,提问作者CodeSpent
相关产品推荐
相关产品推荐

