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

Node.js部署Cyclic/Vercel遇只读文件系统IO错误求助

问题排查与解决

错误原因

Cyclic、Vercel这类Serverless部署平台的文件系统是只读的,你的代码尝试在项目目录(__dirname指向的路径)下创建文件夹并初始化LevelDB,而LevelDB需要读写权限来创建LOCK文件和存储数据,这在只读环境下必然失败。本地开发环境文件系统有完全读写权限,所以不会报错。

解决方案

1. 使用平台提供的临时可写路径(非持久化)

如果数据不需要持久化,只是临时使用,可以用平台提供的临时目录。Node.js中可以通过os.tmpdir()获取系统临时路径:

const fs = require("fs");
const level = require("level");
const path = require("path");
const os = require("os");

// 用临时目录替代项目目录
const tempDir = path.join(os.tmpdir(), 'matic');

fs.mkdir(path.join(tempDir, 'exceptions'), {recursive: true}, (err) => { if (err) { return console.error(err);}
});
fs.mkdir(path.join(tempDir, 'exceptions/eth'), {recursive: true}, (err) => {if (err) {return console.error(err);}
});
fs.mkdir(path.join(tempDir, 'addresses'), {recursive: true}, (err) => {
    if (err) {return console.error(err);}
});

const dbEthExceptions = level(
    path.join(tempDir, 'exceptions/eth')
);
const dbAddress = level(
    path.join(tempDir, 'addresses')
);

注意:临时目录的数据会在函数执行结束或平台清理时丢失,不适合需要持久化的场景。

2. 改用云端持久化数据库(推荐)

LevelDB是本地文件型数据库,不适合Serverless环境。建议替换为云端键值存储或数据库服务,比如:

  • Redis(适合键值对场景,和LevelDB用法接近)
  • MongoDB(文档型数据库)
  • AWS DynamoDB、Cloud Firestore等平台原生数据库

以Redis为例,替换后的代码大致结构:

const redis = require("redis");
const client = redis.createClient({
  url: "你的Redis连接地址"
});

client.connect().catch(console.error);

// 替代LevelDB的读写操作
// 写入:await client.set('key', 'value')
// 读取:const value = await client.get('key')

3. 针对Vercel的额外选项

如果使用Vercel,可以考虑使用Vercel KV(官方提供的键值存储服务),它和LevelDB的使用模式兼容,且支持持久化,适配Serverless环境。

内容的提问来源于stack exchange,提问作者Qwert zaxs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:40:38