Next.js 13部署Vercel遇EROFS只读文件系统错误求助
解决Vercel上Next.js 13 API路由无法写入文件的问题
问题根源
Vercel服务器环境里,process.cwd()指向的/var/task是只读文件系统。你把/tmp和它拼接后,实际路径变成了/var/task/tmp——这个目录属于只读区域,自然无法写入文件。而正确的临时目录是系统独立提供的/tmp,并非项目目录下的子目录。
修复方案
改用Node.js的os.tmpdir()获取系统原生的临时目录路径,替换手动拼接的逻辑:
import { join } from 'path'; import { writeFileSync, readFileSync } from 'fs'; import os from 'os'; // 获取Vercel环境下的正确临时目录路径 const USERS_FILE_PATH = join(os.tmpdir(), 'data.json'); // 写入用户列表 writeFileSync(USERS_FILE_PATH, JSON.stringify(users)); // 读取用户列表 const usersData = JSON.parse(readFileSync(USERS_FILE_PATH, 'utf8'));
额外注意事项
- Vercel的临时目录是每个函数实例独立且临时存在的,函数冷启动或实例重启后,之前写入的文件会被清空,不能用来做持久化存储。如果需要长期保存用户数据,建议使用数据库(如Supabase、PlanetScale)或Vercel KV这类专用存储服务。
- 本地开发时,
os.tmpdir()会指向系统默认的临时目录(比如Windows的C:\Users\<用户名>\AppData\Local\Temp、macOS的/tmp),不影响本地测试读写功能。
内容的提问来源于stack exchange,提问作者Abaga
相关产品推荐
相关产品推荐

