Mongoose find方法在async函数中无法正常工作求助
问题分析与解决方案
核心问题定位
你的代码存在两个关键问题:
- 异步操作未正确等待:最初调用
getList()时未加await,导致异步查询还未完成就跳过执行后续代码; - 无错误捕获与连接状态验证:当添加
await getList()后,Book.find()卡住无输出,说明查询操作未完成或失败,但未捕获错误,同时未验证定时任务执行时Mongoose的数据库连接状态。
修复后的完整代码
const mongoose = require('mongoose'); const Book = require('./models/Book'); // 确保模型路径正确 const notifyBookDefaulties = async () => { console.log("Start"); const getList = async () => { console.log("Fetching"); try { // 先验证数据库连接状态,1代表已连接 if (mongoose.connection.readyState !== 1) { throw new Error('数据库未连接,无法执行查询'); } // 直接传入Date对象,无需转ISO字符串,Mongoose可直接处理Date类型字段 const books = await Book.find({ "users.dueDate": { $lt: new Date() } }); console.log(books); console.log("Fetched"); return books; } catch (err) { console.error('获取逾期书籍失败:', err); throw err; // 抛出错误让上层捕获 } }; try { await getList(); // 必须await异步函数才能等待其执行完成 console.log("completed"); } catch (error) { console.error('定时任务执行失败:', error); } console.log("End"); }; // 定时任务调用 cron.schedule("00 10 * * *", async function () { await notifyBookDefaulties(); });
关键修复点说明
- 强制等待异步操作:调用
getList()时必须加await,确保查询完成后再执行后续代码; - 添加连接状态检查:定时任务可能在服务器启动初期或连接断开后触发,提前验证数据库连接状态可快速定位问题;
- 错误捕获链路完整:在
getList内部和外层调用都添加try/catch,确保任何错误都能被打印排查; - 简化查询条件:直接使用
new Date()而非toISOString(),避免字符串与Date类型字段的潜在比较问题。
额外排查建议
- 确认
Book模型在定时任务执行前已正确导入并编译,模型文件需先于定时任务加载; - 检查Mongoose连接配置,确保开启连接池并设置合理的超时、重连参数,避免连接断开后无法自动恢复;
- 临时将定时任务改为每分钟执行(
* * * * *),方便快速测试修复效果。
内容的提问来源于stack exchange,提问作者Roshan Shetty
相关产品推荐
相关产品推荐

