保存文件时触发ENOENT错误:本地及部署后如何修复?
Node.js保存JSON文件时出现ENOENT错误的解决方案
问题代码
用户的保存文件代码如下:
saveFile = (i, data) => { var filename = `${i}_may.json`; var folder_list = ["desktop", "data", filename]; var dir = "."; folder_list.forEach(function (x, i) { dir = require("path").join(dir, `${x}`); if (!fs.existsSync(dir)) { fs.writeFileSync(dir, JSON.stringify(data)); } }); };
报错信息
运行时持续抛出以下错误:
Error: ENOENT: no such file or directory, open 'desktop\data' errno: -4058, syscall: 'open', code: 'ENOENT', path: 'desktop\\data'
用户确认系统桌面存在data文件夹,但代码无法识别,需要实现本地和部署环境都能正常运行的逻辑。
问题根源
- 路径指向错误:代码中使用相对路径
./desktop/data,指向的是当前工作目录下的文件夹,而非用户系统桌面的文件夹,两者路径完全不同。 - 文件夹与文件创建逻辑混淆:
fs.writeFileSync是用于创建并写入文件的API,不能用来创建文件夹。循环中把desktop、data这些文件夹路径当成文件去写入,直接触发ENOENT错误。 - 未区分部署环境:服务器部署环境不存在“桌面”概念,硬编码桌面路径会导致路径完全无效。
修正方案
1. 区分环境配置路径
- 本地开发时,通过
os.homedir()获取用户主目录,拼接系统桌面的目标文件夹路径,跨Windows/macOS/Linux都能生效。 - 部署环境(生产环境)时,使用项目根目录下的专用数据文件夹,避免依赖本地桌面路径。
2. 修复目录与文件创建逻辑
- 使用
fs.mkdirSync并添加{ recursive: true }参数,递归创建多级文件夹,无需手动逐个创建目录层级。 - 分离文件夹创建与文件写入逻辑,避免将文件夹路径当成文件处理。
修正后的代码
const fs = require('fs'); const path = require('path'); const os = require('os'); const saveFile = (i, data) => { const filename = `${i}_may.json`; let targetDir; // 根据环境变量区分本地开发与部署环境 if (process.env.NODE_ENV === 'production') { // 部署环境:项目根目录下的data文件夹 targetDir = path.join(__dirname, 'data'); } else { // 本地开发:用户桌面的data文件夹 targetDir = path.join(os.homedir(), 'Desktop', 'data'); } // 递归创建目标文件夹(如果不存在) if (!fs.existsSync(targetDir)) { fs.mkdirSync(targetDir, { recursive: true }); } // 拼接最终文件路径并写入 const filePath = path.join(targetDir, filename); fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); };
额外注意事项
- 权限问题:部署时要确保目标文件夹(如项目的
data文件夹)有写入权限,否则会抛出权限错误。 - 异步优化:如果是网站服务场景,建议使用
fs.promises的异步API(mkdir、writeFile)替代同步方法,避免阻塞Node.js事件循环,提升服务性能。
内容的提问来源于stack exchange,提问作者Pisa Ponente
相关产品推荐
相关产品推荐

