部署在Render的网站出现ENOENT错误:mkdir找不到文件或目录
问题解决思路
问题根源
- 平台目录结构差异:你本地环境的
os.homedir()下默认存在desktop文件夹,但Render平台的/opt/render(即os.homedir()指向的目录)里没有这个目录。而mkdirSync默认不会递归创建父目录,直接创建desktop/data/xxx时,因为上层的desktop不存在,就会触发ENOENT错误。 - 变量名错误:函数参数是
folderName,但路径拼接用的是filename,如果filename没在其他地方声明,这会导致变量未定义,也是潜在问题。
解决方案
方案1:让mkdirSync递归创建目录
修改代码,给mkdirSync加上{ recursive: true }选项,这样不管上层目录是否存在,都会自动创建所有需要的父目录:
const fs = require("fs"); const path = require("path"); const os = require("os"); const createFolder = (folderName) => { // 修正变量名:用函数参数folderName替代filename const dir = path.join(os.homedir(), `desktop/data/${folderName}`); if (!fs.existsSync(dir)) { // 添加recursive选项实现递归创建 fs.mkdirSync(dir, { recursive: true }); } };
方案2:改用Render兼容的可写目录
Render平台不建议依赖宿主目录的固定结构,推荐使用以下两种目录:
- 临时存储(数据无需长期保留):用
/tmp目录,Render允许读写,不过数据会定期清理:
const fs = require("fs"); const path = require("path"); const createFolder = (folderName) => { const dir = path.join("/tmp", `data/${folderName}`); if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } };
- 持久化存储:在项目根目录下创建自定义文件夹(比如
data),基于这个路径创建子目录,确保数据长期保留:
const fs = require("fs"); const path = require("path"); const createFolder = (folderName) => { // 根据项目结构调整路径,__dirname是当前脚本所在目录 const dir = path.join(__dirname, "../data", folderName); if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } };
注意:如果用项目根目录的文件夹,不要在.gitignore里屏蔽它,否则部署时该目录不会被创建,第一次运行代码会自动生成。
内容的提问来源于stack exchange,提问作者Pisa Ponente
相关产品推荐
相关产品推荐

