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

如何等待Sequelize的Recipe.findOne执行完成后再执行后续代码

解决异步操作等待问题的方案

你的核心问题在于forEach不会等待异步的Recipe.findOne操作完成,就直接执行了counter++和callBack,这导致回调逻辑在所有文件检查和删除操作完成前就触发了,统计结果自然不准确。

我们可以用async/await结合Promise.all来处理所有异步操作,确保所有数据库查询和文件删除完成后再统计结果并返回响应。下面是重构后的代码:

exports.deleteImagesNotUsed = async (req, res) => { 
  const directory = "./uploads";

  try {
    // 读取目录下的所有文件
    const files = await fs.promises.readdir(directory);
    // 过滤掉不需要检查的默认图片
    const targetFiles = files.filter(file => file !== "no-image.jpg");

    // 为每个文件创建异步处理的Promise
    const deleteResults = await Promise.all(targetFiles.map(async (file) => {
      const recipe = await Recipe.findOne({
        where: { imageFileName: file }
      });

      // 如果没有找到关联的Recipe,删除文件
      if (!recipe) {
        const path = `${directory}/${file}`;
        await fs.promises.unlink(path); // 改用异步的unlink,避免阻塞事件循环
        return true; // 标记为已删除
      }
      return false; // 标记为未删除
    }));

    // 统计删除的文件数量
    const counterfilesDeleted = deleteResults.filter(result => result).length;

    // 根据数量返回对应的消息
    let message;
    switch (counterfilesDeleted) {
      case 0:
        message = "No file deleted.";
        break;
      case 1:
        message = "One file deleted.";
        break;
      default:
        message = `${counterfilesDeleted} files deleted.`;
        break;
    }

    res.send({ message });
  } catch (error) {
    // 处理可能的错误,比如读取目录失败、数据库查询失败、删除文件失败
    res.status(500).send({ message: "An error occurred while cleaning unused images.", error: error.message });
  }
};

关键改进点:

  • 使用async/await让异步代码逻辑更清晰,避免回调嵌套的混乱
  • 用Promise.all等待所有文件的检查和删除操作完成,确保统计结果准确
  • 改用异步的fs.promises.unlink替代同步的fs.unlinkSync,避免阻塞Node.js事件循环
  • 添加了完整的错误处理,捕获并返回可能出现的异常(比如权限问题、数据库连接失败等)
  • 去掉了不必要的回调函数,直接在async函数中处理响应逻辑

这样修改后,所有的数据库查询和文件删除操作都会完成后,才会统计删除数量并返回响应,完全解决了你之前的等待问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:22:30