Node.js中点击Continue Reading后,如何确定blog.ejs显示的博客文章
解决Node.js博客单页无法区分文章的问题
先说说你之前方法的问题
GET请求没有req.body,req.body是用来接收POST请求提交的数据的,所以你用req.body["h3"].innerHTML根本拿不到数据。- 前端没法直接把页面元素的内容通过
GET请求的 body 传递给后端,这种思路本身就行不通。
正确解决方案(无数据库版)
因为你还没用到数据库,先通过模拟博客数据+URL参数来实现区分文章的功能,步骤如下:
1. 在index.js里模拟博客数据
先定义一个存储博客的数组,把所有文章的标题、内容都存在这里:
// 模拟博客数据,后续可以替换成数据库查询 const blogPosts = [ { title: "我的第一篇博客", content: "这是我用Node.js+Bootstrap搭建的第一篇博客,记录学习心得..." }, { title: "Node.js路由入门", content: "路由是Node.js服务端的核心概念,用来处理不同URL的请求..." }, // 可以继续添加更多文章 ]; // 确保welcome页面能拿到这些数据,渲染文章列表 app.get("/", (req, res) => { res.render("welcome.ejs", { posts: blogPosts }); });
2. 修改welcome.ejs的链接,传递文章标识
给每个"Continue reading"链接加上文章标题(或者唯一id)作为URL参数,这里用路由参数的方式(更友好的URL),记得用encodeURIComponent处理特殊字符:
<!-- 假设你在welcome.ejs里用循环渲染文章列表 --> <% posts.forEach(post => { %> <div class="blog-post"> <h3><%= post.title %></h3> <!-- 其他文章摘要内容 --> <a href="/blogs/<%= encodeURIComponent(post.title) %>" class="btn btn-primary">Continue reading</a> </div> <% }) %>
3. 修改index.js的博客详情路由
修改路由,通过req.params获取传递的标题,然后从模拟数据里找到对应的文章:
app.get("/blogs/:title", (req, res) => { // 解码URL里的标题 const postTitle = decodeURIComponent(req.params.title); // 从模拟数据里找到对应文章 const foundPost = blogPosts.find(post => post.title === postTitle); // 渲染blog.ejs,把找到的文章传过去 if (foundPost) { res.render("blog.ejs", { post: foundPost }); } else { // 如果没找到文章,返回404提示 res.render("blog.ejs", { post: { title: "文章不存在", content: "抱歉,找不到你要的文章" } }); } });
4. 修改blog.ejs显示对应文章内容
直接使用传递过来的文章数据渲染即可:
<div class="blog-detail"> <h2><%= post.title %></h2> <p><%= post.content %></p> </div>
补充说明
如果觉得用标题当标识容易重复,也可以给每篇文章加唯一的id字段(比如id: 1、id:2),然后传递id作为路由参数,查找的时候用post.id === parseInt(req.params.id),这样更可靠。后续接入数据库后,只需要把模拟数据替换成数据库查询语句即可,逻辑基本一致。
内容的提问来源于stack exchange,提问作者BUE
相关产品推荐
相关产品推荐

