Node.js连续执行目录创建、文件写入、目录删除时报ENOENT错误如何解决
问题原因
你代码中使用的mkdirp、fs.writeFile、rimraf都属于异步非阻塞API,在main函数中连续调用三个函数时,程序不会等待前一个操作执行完成再触发下一个,三个操作会并发进入事件队列等待执行,实际执行顺序完全不固定。
当三个操作同时触发时,大概率会出现「删除目录操作先执行完毕」的情况,此时创建文件的操作才开始执行,自然找不到用于写入文件的./test目录,就抛出了你遇到的ENOENT错误。单独执行函数或者仅执行前两个函数时,没有删除操作抢占执行顺序,所以运行正常。
修复方案
推荐使用async/await将异步操作改为串行执行,保证操作按「创建目录→创建文件→删除目录」的顺序执行,修改后代码如下:
const rimraf = require("rimraf"); const mkdirp = require("mkdirp"); const fs = require("fs").promises; // 改用Promise版本的fs API async function createDirectory() { await mkdirp("./test"); } async function createFile() { await fs.writeFile("./test/test.txt", "this is my text"); console.log("Results Received"); } async function deleteDirectory() { await rimraf("./test"); console.log("Succesfully deleted a directory"); } async function main() { try { await createDirectory(); await createFile(); await deleteDirectory(); } catch (err) { console.log(err); } } main();
如果你习惯用回调写法,也可以通过回调嵌套的方式控制执行顺序,但代码可读性和可维护性会远低于async/await写法,不推荐使用。
内容的提问来源于stack exchange,提问作者Foreastbtch
相关产品推荐
相关产品推荐

