在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直接使用该存储:
- 安装依赖:
npm install @cyclic.sh/dynamodb
- 修改代码替换数据源:
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为例:
- 安装依赖:
npm install json-server-mongodb
- 修改代码:
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
相关产品推荐
相关产品推荐

