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

在cyclic.sh部署json-server遇EROFS只读文件系统错误,如何解决?

解决Cyclic.sh部署json-server时POST请求只读文件系统错误

问题原因

Cyclic.sh的容器文件系统是只读的,默认的json-server会尝试将POST/PUT/DELETE请求的修改写入本地db.json文件,因此触发EROFS: read-only file system错误。

解决方案

方案1:使用内存数据库(适合测试/无需持久化场景)

将json-server切换为内存模式,数据仅在服务器运行时存在,重启后丢失。修改代码如下:

const jsonServer = require('json-server')
const cors = require('cors')

const server = jsonServer.create()
// 定义初始数据结构,替换成你的业务数据
const initialDatabase = {
  posts: [{ id: 1, title: "示例文章" }],
  comments: [{ id: 1, body: "示例评论", postId: 1 }]
}
const router = jsonServer.router(initialDatabase)
const middlewares = jsonServer.defaults()

server.use(cors())
server.use(jsonServer.bodyParser)
server.use(middlewares)
server.use(router)

const PORT = process.env.PORT || 8000

server.listen(PORT, () => {
  console.log(`JSON Server is running on http://localhost:${PORT}`)
})

方案2:使用Cyclic.sh内置持久化存储(推荐,支持数据持久化)

Cyclic提供了基于DynamoDB的持久化存储,通过@cyclic.sh/dynamodb包可以让json-server直接使用该存储:

  1. 安装依赖:
npm install @cyclic.sh/dynamodb
  1. 修改代码替换数据源:
const jsonServer = require('json-server')
const cors = require('cors')
const CyclicDB = require('@cyclic.sh/dynamodb')

const server = jsonServer.create()
// 连接Cyclic的数据库,环境变量会自动在部署时配置
const db = CyclicDB(process.env.CYCLIC_DB)
// 创建一个集合作为json-server的数据源,可自定义集合名
const router = jsonServer.router(db.collection('data'))
const middlewares = jsonServer.defaults()

server.use(cors())
server.use(jsonServer.bodyParser)
server.use(middlewares)
server.use(router)

const PORT = process.env.PORT || 8000

server.listen(PORT, () => {
  console.log(`JSON Server is running on http://localhost:${PORT}`)
})

部署后,所有数据修改会自动持久化到Cyclic的DynamoDB存储中,重启服务器不会丢失数据。

方案3:使用外部数据库(如MongoDB)

如果已有外部数据库,可使用json-server-mongodb等适配包,将json-server的数据源指向外部数据库。以MongoDB为例:

  1. 安装依赖:
npm install json-server-mongodb
  1. 修改代码:
const jsonServer = require('json-server')
const cors = require('cors')
const MongoRouter = require('json-server-mongodb')

const server = jsonServer.create()
// 替换为你的MongoDB连接字符串
const router = MongoRouter('mongodb+srv://<username>:<password>@cluster0.mongodb.net/<dbname>')
const middlewares = jsonServer.defaults()

server.use(cors())
server.use(jsonServer.bodyParser)
server.use(middlewares)
server.use(router)

const PORT = process.env.PORT || 8000

server.listen(PORT, () => {
  console.log(`JSON Server is running on http://localhost:${PORT}`)
})

内容的提问来源于stack exchange,提问作者Satyajit Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:50:25