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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:06:03