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

Heroku部署Node.js服务器后无法读取写入的users.json文件问题

问题根源:Heroku的临时文件系统特性

哦,这个坑我踩过好多次!你遇到的问题本质是Heroku的文件系统是临时(Ephemeral)的,这是PaaS平台的常见特性,但很容易被忽略。

为什么日志显示写入成功,但找不到文件?

  • Heroku的每个dyno(运行你应用的容器)都有自己的临时文件系统,你用fs.writeFile写入的users.json确实保存在当前dyno的存储里,所以日志会提示“file saved”。
  • 但这个存储是非持久化的:一旦dyno重启(比如应用更新、自动缩放、Heroku定期重启,甚至应用休眠后唤醒),所有临时存储的文件都会被清空,恢复到你部署时的Git仓库状态。
  • 另外,你用git pull拉取的是你推送到Heroku的Git仓库代码,而dyno运行时生成的文件不会同步回Git仓库,所以拉取后自然看不到这个文件。

怎么解决?

别再用本地文件存储数据了,Heroku这种平台不适合这么做,换用持久化存储方案:

1. 用Heroku自带的PostgreSQL(推荐)

Heroku提供免费的PostgreSQL实例,适合存储结构化数据(比如用户提交的表单数据)。举个简单的修改示例:

  • 先安装pg模块:npm install pg
  • 替换原来的fs.writeFile逻辑为数据库插入:
const { Pool } = require('pg');
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: { rejectUnauthorized: false } // Heroku需要这个配置
});

// 处理表单提交时
app.post('/submit', async (req, res) => {
  const { username, email } = req.body; // 假设表单字段是username和email
  try {
    await pool.query('INSERT INTO users (username, email) VALUES ($1, $2)', [username, email]);
    res.send('数据保存成功!');
    console.log('数据已存入数据库');
  } catch (err) {
    console.error(err);
    res.status(500).send('保存失败');
  }
});

你需要先在Heroku控制台创建PostgreSQL add-on,然后运行迁移创建users表。

2. 用MongoDB Atlas

如果偏好NoSQL,可以用MongoDB的云端服务Atlas,免费版足够小项目使用。用mongoose连接的示例:

const mongoose = require('mongoose');
mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });

const UserSchema = new mongoose.Schema({
  username: String,
  email: String
});
const User = mongoose.model('User', UserSchema);

// 处理表单提交
app.post('/submit', async (req, res) => {
  const newUser = new User(req.body);
  try {
    await newUser.save();
    res.send('数据保存成功!');
    console.log('数据已存入MongoDB');
  } catch (err) {
    console.error(err);
    res.status(500).send('保存失败');
  }
});

然后在Heroku的环境变量里配置MONGODB_URI为你的Atlas连接字符串。

3. 临时调试方案(不推荐用于生产)

如果只是临时想确认文件内容,可以用Heroku命令进入当前运行的dyno查看:

heroku run bash
cat users.json

但记住,一旦dyno重启,这个文件就会消失,所以只适合临时调试用。

总结一下:Heroku的临时文件系统不适合存储需要持久化的数据,必须用外部数据库或者专门的存储服务。

内容的提问来源于stack exchange,提问作者Glitch Fish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:26