如何在Express.js中无需数据库实现博客文章的存储与页面展示?
无数据库环境下博客文章持久化的实现方案
一、内存临时存储(快速实现,仅适合开发调试)
当前代码每次提交只传递单篇文章,且没有持久化存储,刷新页面自然丢失数据。最简单的临时解决方式是在全局维护一个数组保存所有文章:
- 在Express应用初始化时定义全局数组:
// 全局存储文章,Node服务重启后数据会清空 let articles = [];
- 修改POST路由,把新文章加入数组后再渲染所有内容:
app.post("/submit", (req, res) => { const newArticle = req.body.post; // 简单校验非空内容 if (newArticle?.trim()) { articles.push(newArticle); } // 渲染时传入全部文章 res.render("index.ejs", { data: articles }); });
- 补充GET首页路由,确保刷新页面能加载所有已存文章:
app.get("/", (req, res) => { res.render("index.ejs", { data: articles }); });
缺点:Node服务重启后所有数据会丢失,仅适合开发阶段快速验证功能。
二、JSON文件持久化存储(生产可用,重启不丢失数据)
如果需要数据真正持久化,可将文章写入本地JSON文件,启动时读取、提交时更新:
- 项目根目录创建
articles.json文件,初始内容为:
[]
- 封装文件读写的异步工具函数(避免阻塞服务):
const fs = require('fs').promises; const path = require('path'); // 读取所有文章 async function getArticles() { try { const filePath = path.join(__dirname, 'articles.json'); const fileContent = await fs.readFile(filePath, 'utf8'); return JSON.parse(fileContent); } catch (err) { console.error('读取文章文件失败:', err); return []; } } // 保存新文章 async function saveNewArticle(article) { try { const articles = await getArticles(); articles.push(article); const filePath = path.join(__dirname, 'articles.json'); // 格式化写入,方便查看 await fs.writeFile(filePath, JSON.stringify(articles, null, 2)); } catch (err) { console.error('保存文章失败:', err); } }
- 修改路由逻辑,结合工具函数实现持久化:
// 确保已配置body-parser解析表单数据 app.use(express.urlencoded({ extended: true })); app.get("/", async (req, res) => { const articles = await getArticles(); res.render("index.ejs", { data: articles }); }); app.post("/submit", async (req, res) => { const newArticle = req.body.post; if (newArticle?.trim()) { await saveNewArticle(newArticle); } const articles = await getArticles(); res.render("index.ejs", { data: articles }); });
优点:数据持久化存储,服务重启后不会丢失,满足小型博客的无数据库需求。
三、其他可选方案
- 前端LocalStorage存储:把文章存在用户浏览器的LocalStorage中,页面刷新时从本地读取渲染。但数据仅存在当前用户浏览器,无法实现多用户共享,适合个人离线博客场景。
- CSV/TXT文件存储:原理和JSON文件一致,只是读写时需要对应格式的解析逻辑,适合有特定格式需求的场景。
内容的提问来源于stack exchange,提问作者Bhawesh Pandey
相关产品推荐
相关产品推荐

