NodeJS在系统根目录创建目录遭遇EROFS只读文件系统错误的技术咨询
解决Mac系统中创建目录时的EROFS只读文件系统错误
首先得明确一个关键误区:你混淆了系统根目录/和用户主目录~。从Catalina版本开始,Mac的系统根目录/受系统完整性保护(SIP)限制,处于只读状态,所以直接尝试创建/test必然会触发权限错误。而你提到的存放全局node_modules、文档、桌面的~目录,实际对应/Users/你的用户名/,这个目录拥有完全读写权限,才是你应该用来创建个人项目文件夹的正确位置。
下面给你几个具体的解决方案,包括原生Node.js方法和第三方工具包:
1. 使用Node.js原生模块修正路径并创建多级目录
Node.js的fs.mkdir支持recursive: true参数一键创建多级目录,同时我们可以用os.homedir()来正确解析用户主目录(避免手动写死路径导致的兼容性问题):
const fs = require('fs'); const os = require('os'); const path = require('path'); // 构建目标路径:对应~/SOME_DIR/ANOTHER_DIR const targetDir = path.join(os.homedir(), 'SOME_DIR', 'ANOTHER_DIR'); fs.mkdir(targetDir, { recursive: true }, (err) => { if (err) { res.status(500).json({ status: 'fail', err, error: err.message }); } else { res.json({ status: 'success', message: '多级目录创建完成' }); } });
2. 使用第三方工具包mkdirp简化操作
mkdirp是一个专门用来递归创建目录的工具包,语法更简洁,还支持Promise和async/await写法,非常适合处理多级目录场景:
第一步:安装依赖
npm install mkdirp
第二步:Promise版本代码
const mkdirp = require('mkdirp'); const os = require('os'); const path = require('path'); const targetDir = path.join(os.homedir(), 'SOME_DIR', 'ANOTHER_DIR'); mkdirp(targetDir) .then(() => res.json({ status: 'success', message: '目录创建成功' })) .catch(err => res.status(500).json({ status: 'fail', err, error: err.message }));
第三步:async/await版本(更优雅)
const mkdirp = require('mkdirp'); const os = require('os'); const path = require('path'); async function createTargetDir() { try { const targetDir = path.join(os.homedir(), 'SOME_DIR', 'ANOTHER_DIR'); await mkdirp(targetDir); res.json({ status: 'success', message: '目录创建成功' }); } catch (err) { res.status(500).json({ status: 'fail', err, error: err.message }); } } createTargetDir();
额外提醒:关于系统根目录的读写
如果你确实有特殊需求要在系统根目录附近创建文件夹,强烈不建议关闭SIP(会大幅降低系统安全性),可以考虑使用/Users/Shared目录——这是Mac预留的全局可写目录,适合存放多用户共享的文件。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

