Node.js 启动时因 tmp 目录不可写报 EPERM/EACCES 错误,根本原因是进程试图向被锁定、只读或挂载受限的系统默认临时路径(如 Windows %LOCALAPPDATA%\Temp、Linux /tmp)写入文件;最直接有效的解法是通过设置 TMP/TMPDIR/TEMP 环境变量指向用户有完全读写权限的自定义目录,并确保该目录真实存在且权限正确。

Node.js 启动时因 tmp 目录不可写而报 EPERM 或 EACCES
这类错误通常出现在 Node.js 运行某些依赖临时文件的工具链时(比如 esbuild、vite、jest 或自定义 CLI),错误信息类似:EPERM: operation not permitted, mkdir 'C:\Users\XXX\AppData\Local\Temp\some-random-dir' 或 EACCES: permission denied, mkdir '/tmp/.vite'。根本原因不是 VSCode 权限低,而是 Node.js 进程试图往系统默认 tmp 路径写文件,但该路径被锁定、只读,或挂载方式不支持写入(尤其在 WSL / OneDrive / 公司策略管控环境下)。
- Windows 上常见于
%LOCALAPPDATA%\Temp被组策略设为只读,或杀毒软件实时扫描拦截了目录创建 - macOS/Linux 下若
/tmp是 tmpfs 且空间耗尽,或挂载时加了noexec,nosuid,nodev等 flag,也会拒绝写入 - WSL 中若项目在
/mnt/c/...下,且TEMP指向 Windows 的%TEMP%,而该路径在 WSL 内部不可写(NTFS 权限未映射) - OneDrive 同步文件夹下生成临时文件时,可能触发同步锁导致
mkdir失败
手动覆盖 tmpdir 环境变量是最直接有效的解法
Node.js 尊重 TMP、TEMP、TMPDIR 三个环境变量(优先级依平台略有差异),只要它们指向一个当前用户有完整读写权限的目录,就能绕过系统默认 tmp 的限制。不需要改系统设置,也不用管理员权限。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 在 VSCode 终端中临时生效:运行
export TMPDIR="/home/yourname/tmp"(Linux/macOS)或$env:TMP="C:\Users\YourName\tmp"(PowerShell) - 让所有终端启动即生效:把变量加进 shell 配置文件(如
~/.zshrc或%USERPROFILE%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1) - 仅对当前任务生效(推荐):在
launch.json的env字段里指定,例如:"env": { "TMPDIR": "${workspaceFolder}/.tmp" },然后确保该目录存在且可写(VSCode 不会自动创建) - 避免路径含空格或中文——某些底层工具(尤其是 C++ 编写的二进制)解析失败时静默崩溃,不报错
检查并修复目标 tmp 目录的实际权限状态
光设环境变量还不够。如果新指定的目录本身没写入权,Node.js 仍会失败。必须确认该路径真实可用。
- 在终端执行
mkdir -p /path/to/your/tmp && touch /path/to/your/tmp/test && rm /path/to/your/tmp/test(Linux/macOS/WSL),或mkdir C:\tmp >nul && type nul > C:\tmp\test && del C:\tmp\test(Windows CMD) - Windows 上右键目标文件夹 → “属性” → “安全” → 确认你的用户有“完全控制”或至少“修改”权限;若无,点“编辑”勾选后保存
- WSL 中若用
~/tmp,确保它不在/mnt/c/下——否则chmod无效,mkdir可能返回成功但后续open()失败 - 不要复用
/tmp或%TEMP%的子目录(如/tmp/myapp)——父目录权限问题会传染
npm run 和调试器启动时的 tmp 行为差异
npm run 脚本和 VSCode 调试器(launch.json)继承的环境不同,tmp 路径可能不一致,导致一个能跑、另一个报错。
-
npm run默认使用 shell 启动,读取 shell 的env,所以改~/.zshrc或 PowerShell profile 会影响它 - VSCode 调试器默认不加载 shell profile,除非你显式配置
console: "integratedTerminal"并设env—— 所以单独配launch.json更可靠 - 某些工具(如
vite)会主动调用os.tmpdir(),而该函数在 Node.js 中硬编码 fallback 逻辑,不会受PATH影响,只认那三个环境变量 - 如果用
node --inspect启动,Chrome DevTools 里的process.env.TMPDIR显示值,就是实际生效的路径,可用于验证
echo $TMPDIR 或 Write-Host $env:TMP 确认值,再 ls -ld 或右键查权限,比反复重装 Node.js 或开管理员模式高效得多。

















