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

每次页面重载后销毁并重新填充Heroku托管的json-server假数据库的函数如何实现

实现Heroku托管json-server数据库重置的方案

1. 后端(Heroku部署的json-server侧)新增重置接口

首先修改你的json-server启动文件(通常命名为server.js),启动时先读取原始db.json内容作为基准数据,新增专属重置接口覆盖当前数据库状态:

const jsonServer = require('json-server');
const fs = require('fs');
const path = require('path');
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();

// 服务启动时只读一次初始db.json,作为基准数据存入内存
const initialDb = JSON.parse(fs.readFileSync(path.join(__dirname, 'db.json'), 'utf-8'));

server.use(middlewares);

// 新增全局重置接口
server.post('/reset', (req, res) => {
  // 直接覆盖当前运行时的数据库状态
  router.db.setState(initialDb);
  // 可选:持久化到Heroku临时文件系统,dyno重启前改动都会保留
  fs.writeFileSync(path.join(__dirname, 'db.json'), JSON.stringify(initialDb, null, 2));
  res.status(200).json({ message: '数据库已重置为初始状态' });
});

server.use(router);

const port = process.env.PORT || 3000;
server.listen(port, () => {
  console.log(`JSON Server 运行在端口 ${port}`);
});

2. 前端侧触发重置逻辑

对应你的两种需求场景分别实现触发逻辑:

2.1 页面重载时触发

监听页面beforeunload事件,页面重载/关闭前调用重置接口,优先用navigator.sendBeacon避免请求被浏览器中断:

window.addEventListener('beforeunload', () => {
  navigator.sendBeacon('https://你的Heroku应用域名/reset');
});

2.2 会话结束时触发

在你的会话销毁逻辑(如登出、超时回调)中直接调用重置接口即可:

// 示例:会话超时回调中插入重置逻辑
function handleSessionExpire() {
  fetch('https://你的Heroku应用域名/reset', { method: 'POST' })
    .then(res => res.json())
    .catch(err => console.error('重置请求失败', err));
}

注意事项

  • 如果有多用户同时访问,重置操作会影响所有用户的使用,因为是全局修改数据库。如果你需要每个用户独立的临时数据库,需要在后端增加用户标识区分数据,不能直接全局重置
  • Heroku免费dyno半小时无访问就会自动休眠,休眠后重新启动会自动回到部署时的db.json状态,如果你不需要实时重置,靠这个特性也能自动定期恢复初始状态
  • 测试效果时,可先调用几次增删改接口修改数据,再调用/reset接口,再次查询数据就能确认是否回到初始状态

内容的提问来源于stack exchange,提问作者Toan Lam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:48:03