测试完成后执行目录删除操作时遇到两类错误:非空目录删除失败及fs.rmdir is not a function错误
解决测试后删除目录遇到的两个错误
咱们来逐个搞定你碰到的问题:
1. 错误:fs.rmdir is not a function
这个问题最常见的原因是Node.js版本过低:fs.rmdir的recursive参数是在Node.js 12.10.0才正式支持的,如果你的版本低于这个,不仅recursive选项无效,还可能触发方法识别异常(虽然低版本里fs.rmdir本身存在,但参数不匹配会引发奇怪报错)。
另外也有可能是你误导入了Promise版本的fs模块,但看你的代码写法,这个概率比较低。
快速解决思路:
- 优先升级Node.js到12.10.0或更高版本,这样就能正常使用
recursive: true参数; - 如果没法升级版本,改用兼容性更好的工具(后面会提到)。
2. 错误:Error removing directory which is not empty
这个错误本质是:默认情况下fs.rmdir只能删除空目录,当目录里有文件或子目录时就会报错。你虽然加了recursive: true,但如果Node.js版本不支持这个参数,等于白加,自然删不掉非空目录。
针对不同场景的解决方案
场景一:Node.js 12.10.0+(推荐)
确保版本符合要求后,还要注意异步操作的等待问题:测试框架的after钩子如果是同步执行的,可能在fs.rmdir的回调完成前就结束了,导致删除操作没跑完。建议改成异步版本:
// 用async/await更直观 after(async () => { const fs = require('fs').promises; const path = require('path'); // 用绝对路径避免层级过多导致的路径错误 const dir = path.resolve(__dirname, '../../../../../../downloads'); try { await fs.rmdir(dir, { recursive: true, force: true }); } catch (err) { console.error('删除目录失败:', err); } });
如果习惯用回调,记得通知测试框架等待异步完成:
after((done) => { const fs = require('fs'); const path = require('path'); const dir = path.resolve(__dirname, '../../../../../../downloads'); fs.rmdir(dir, { recursive: true, force: true }, (err) => { if (err) console.error('删除目录失败:', err); done(); // 告诉测试框架异步操作结束 }); });
场景二:Node.js 14.14.0+
可以用更简洁的fs.rm(支持删除文件/目录,递归逻辑更直观):
after(async () => { const fs = require('fs').promises; const path = require('path'); const dir = path.resolve(__dirname, '../../../../../../downloads'); try { await fs.rm(dir, { recursive: true, force: true }); } catch (err) { console.error('删除目录失败:', err); } });
场景三:兼容老版本Node.js(比如v10及以下)
如果没法升级Node.js,推荐用专门做递归删除的rimraf库,兼容性拉满:
- 先安装依赖:
npm install rimraf --save-dev
- 在测试代码中使用:
after(async () => { const rimraf = require('rimraf'); const path = require('path'); const dir = path.resolve(__dirname, '../../../../../../downloads'); try { await rimraf(dir, {}); } catch (err) { console.error('删除目录失败:', err); } });
最后提个小建议:你写的../../../../../../downloads层级太多,很容易因为文件位置变化导致路径错误,用path.resolve(__dirname, 相对路径)生成绝对路径会更可靠。
内容的提问来源于stack exchange,提问作者Mario Ramos García
相关产品推荐
相关产品推荐

