React+Node项目中fs.rmSync递归删除缓存文件夹异常问题
解决Node.js同步删除缓存文件夹时ENOTEMPTY错误的问题
问题场景
React+Node.js架构的网站,编写了清除cache文件夹并重建的路由。Postman测试功能正常,但前端通过Axios调用时出现ENOTEMPTY错误,缓存文件夹内嵌套目录删不干净,空文件夹和根目录文件残留。
核心原因分析
- 同步API的错误处理无效:
fs.rmSync是同步方法,不支持传入回调函数,你写的错误回调逻辑完全不会触发。一旦删除过程中出现异常(比如文件被其他进程占用、递归删除未完成),会直接抛出错误,导致后续的mkdirSync和响应逻辑全部中断。 - 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
相关产品推荐
相关产品推荐

