Node.js使用node-cron运行定时任务时Mongodb查询未执行如何解决?
问题原因与解决方案
核心错误:populate参数使用错误
mongoose 5.x 版本中,populate() 方法的第二个参数为关联模型的字段筛选配置,不支持直接传入查询回调函数。你当前的写法将回调直接作为populate的第二个参数传入,导致回调逻辑永远不会被触发,也不会输出错误或查询结果。
修复方案
方案1:将回调传入exec方法(回调式写法)
将原来的查询逻辑调整为:
Document.find().populate('user').exec((err, docs) => { console.log(err); if (!err) { docs.forEach((doc) => { console.log(doc); }); } });
方案2:使用async/await写法(更推荐)
你的定时任务回调已经声明为async,可以直接用await语法规避回调嵌套问题,同时更容易捕获异常:
const checkDocumentsDate = cron.schedule( '*/1 * * * *', async () => { console.log('here'); try { const docs = await Document.find().populate('user'); docs.forEach(doc => console.log(doc)); } catch (err) { console.log('查询错误:', err); } }, { scheduled: false, } );
可选排查点
如果修改后仍有问题,可以按以下步骤排查:
- 验证mongoose连接状态:在定时任务回调中打印
console.log(mongoose.connection.readyState),返回值为1代表连接正常,若为其他值需检查是否存在多mongoose实例、数据库连接异常的问题。 - 检查模型引入路径:确认
../models/document路径正确,模型文件中引入的mongoose依赖与app.js中执行connect的mongoose依赖为同一个实例,避免node_modules嵌套安装导致多实例问题。
内容的提问来源于stack exchange,提问作者Singh
相关产品推荐
相关产品推荐

