You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):

  1. 在Vercel控制台创建Postgres数据库,获取连接凭证
  2. 用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键值存储服务:

  1. 在Upstash平台创建Redis实例,获取连接URL
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:35:20