You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose find方法在async函数中无法正常工作求助

问题分析与解决方案

核心问题定位

你的代码存在两个关键问题:

  1. 异步操作未正确等待:最初调用getList()时未加await,导致异步查询还未完成就跳过执行后续代码;
  2. 无错误捕获与连接状态验证:当添加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类型字段的潜在比较问题。

额外排查建议

  1. 确认Book模型在定时任务执行前已正确导入并编译,模型文件需先于定时任务加载;
  2. 检查Mongoose连接配置,确保开启连接池并设置合理的超时、重连参数,避免连接断开后无法自动恢复;
  3. 临时将定时任务改为每分钟执行(* * * * *),方便快速测试修复效果。

内容的提问来源于stack exchange,提问作者Roshan Shetty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:31:04