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

React+Node项目中fs.rmSync递归删除缓存文件夹异常问题

解决Node.js同步删除缓存文件夹时ENOTEMPTY错误的问题

问题场景

React+Node.js架构的网站,编写了清除cache文件夹并重建的路由。Postman测试功能正常,但前端通过Axios调用时出现ENOTEMPTY错误,缓存文件夹内嵌套目录删不干净,空文件夹和根目录文件残留。

核心原因分析

  1. 同步API的错误处理无效:fs.rmSync是同步方法,不支持传入回调函数,你写的错误回调逻辑完全不会触发。一旦删除过程中出现异常(比如文件被其他进程占用、递归删除未完成),会直接抛出错误,导致后续的mkdirSync和响应逻辑全部中断。
  2. Windows系统文件锁定问题:同步递归删除在Windows下容易遇到文件锁定场景,前端调用时可能存在缓存文件被读取的情况,导致部分文件夹无法被删除,触发ENOTEMPTY错误。

解决方案

方案1:修复同步方法的异常处理

用try/catch包裹同步操作,确保捕获删除时的异常,同时先检查文件夹存在性避免无意义操作:

const deleteCache = (req, res) => {
  try {
    // 先判断文件夹是否存在,减少无效操作
    if (fs.existsSync('./cache')) {
      fs.rmSync('./cache', { recursive: true, force: true });
    }
    fs.mkdirSync('./cache');
    return res.status(200).send("cache cleared");
  } catch (err) {
    return res.status(400).json({ error: err.message });
  }
};

方案2:改用异步API(推荐)

同步操作会阻塞Node.js事件循环,高并发场景下影响性能,改用异步的fs.promises配合async/await,错误处理更可靠:

const deleteCache = async (req, res) => {
  try {
    await fs.promises.rm('./cache', { recursive: true, force: true });
    // 加recursive参数避免文件夹已存在的报错
    await fs.promises.mkdir('./cache', { recursive: true });
    return res.status(200).send("cache cleared");
  } catch (err) {
    return res.status(400).json({ error: err.message });
  }
};

额外排查点

  • 确认路径正确性:./cache是相对于Node.js进程启动目录的路径,检查前端调用和Postman测试时的进程启动目录是否一致(比如是否用了不同的启动脚本)。
  • 排查文件占用:检查是否有其他进程(如前端静态文件服务、定时任务)正在读写cache内的文件,导致文件被锁定无法删除。可在删除前关闭相关文件句柄,或增加重试逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:50