Node.js 如何在目录不存在时创建它?

Node.js 创建目录用 fs.mkdir 加 { recursive: true },目录已存在不报错、父目录自动创建,一行解决,无需先检查存在性。本文给出同步/异步/Promise 三种写法。

最佳实践
文件、模块与依赖组织示意

现代写法一行搞定:fs.mkdirSync(path, { recursive: true })。recursive: true 让已存在的目录不报错、缺失的父目录一并创建。

三种写法

同步(脚本场景):

const fs = require('fs');
fs.mkdirSync('./output/logs', { recursive: true });

Promise(推荐):

const fs = require('fs').promises;
await fs.mkdir('./output/logs', { recursive: true });

回调:

const fs = require('fs');
fs.mkdir('./output/logs', { recursive: true }, (err) => {
  if (err) console.error(err);
});

老式写法(仅兼容老版本)

Node 10.12 之前没有 recursive 选项,只能先查再建:

if (!fs.existsSync(dir)) {
  fs.mkdirSync(dir);
}

这种写法有"检查后、创建前被别的进程抢先创建"的竞态。现在 Node 版本都支持 recursive,直接用它,不用先 existsSync。

常见问题(FAQ)

Q:recursive 模式下目录已存在会报错吗?
不会,静默成功(幂等)。这正是它适合"确保目录存在"场景的原因。

Q:报错 EACCES 权限不足?
目标路径没有写权限。检查父目录属主,或用有权限的路径;别图省事用 sudo 跑 Node。

Q:报错 ENOTDIR?
路径中某一级是文件而不是目录,例如 ./data.txt/logs。检查路径构成。

Q:要同时创建多级目录?
recursive: true 就是干这个的,./a/b/c 一次到位。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台