Next.js部署Vercel后修改JSON文件遇EROFS错误求助
解决Next.js部署到Vercel后无法修改JSON文件的500错误
错误码EROFS表示只读文件系统,这才是核心问题——Vercel的Serverless函数运行环境是只读的,你本地开发时可以读写项目内的JSON文件,但部署后无法修改项目目录下的文件,和路径无关。
方案1:内存存储(仅临时测试用)
如果只是临时验证业务逻辑,不需要持久化数据,可以直接把用户数据存在内存中,跳过文件写入步骤:
let users = require('data/users.json'); export const usersDBmock = { delete: _delete }; function _delete(id) { users = users.filter((x) => x.id !== id); // 移除saveData调用,不再写入文件 }
注意:Vercel的Serverless函数是无状态的,每次冷启动或函数重启后,数据会重置为初始的JSON内容,仅适合临时测试场景。
方案2:使用Vercel内置数据库(持久化推荐)
如果需要持久化存储数据,推荐使用Vercel官方提供的托管数据库(如Vercel Postgres):
- 在Vercel控制台创建Postgres数据库,获取连接凭证
- 用Prisma或pg库操作数据,示例代码(基于Prisma):
// prisma/schema.prisma model User { id Int @id @default(autoincrement()) // 根据你的需求定义其他字段 } // pages/api/delete-user.js import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export default async function handler(req, res) { if (req.method === 'DELETE') { const { id } = req.query; await prisma.user.delete({ where: { id: parseInt(id) } }); res.status(200).json({ success: true }); } }
方案3:轻量级键值存储(适合小数据量场景)
如果不想使用关系型数据库,可以选择Upstash Redis这类Serverless键值存储服务:
- 在Upstash平台创建Redis实例,获取连接URL
- 用ioredis库操作数据:
import Redis from 'ioredis'; const redis = new Redis(process.env.UPSTASH_REDIS_URL); // 初始化初始数据(仅首次调用时执行) async function initUsers() { const exists = await redis.exists('users'); if (!exists) { const initialUsers = require('data/users.json'); await redis.set('users', JSON.stringify(initialUsers)); } } export const usersDBmock = { async delete(id) { await initUsers(); const users = JSON.parse(await redis.get('users')); const updatedUsers = users.filter(x => x.id !== id); await redis.set('users', JSON.stringify(updatedUsers)); } };
内容的提问来源于stack exchange,提问作者sara lance
相关产品推荐
相关产品推荐

