基于Node、Express、EJS实现用户重定向至上次访问文章的技术问询
已登录用户自动重定向至上次阅读文章的实现方案
一、数据库调整
- 假设你的用户表名为
users,新增一个last_read_article字段,类型为整数(对应文章ID),允许为空。 - 示例SQL语句(以MySQL为例):
ALTER TABLE users ADD COLUMN last_read_article INT NULL;
二、后端(Node+Express)实现步骤
1. 记录用户最后阅读的文章
当用户访问文章详情页时,更新其last_read_article字段。假设文章详情路由为/articles/:id:
// 文章详情路由 app.get('/articles/:id', async (req, res) => { const articleId = parseInt(req.params.id); // 原有逻辑:查询文章详情 const article = await Article.findById(articleId); if (!article) { return res.status(404).send('文章不存在'); } // 若用户已登录,更新最后阅读记录 if (req.isAuthenticated()) { // 用passport做登录验证的情况,替换成你自己的登录判断逻辑 await User.findByIdAndUpdate(req.user._id, { last_read_article: articleId }); } // 原有逻辑:渲染文章详情页 res.render('article', { article }); });
注:如果不用passport,就换成你自己的登录判断方式,比如检查
req.session.user是否存在。
2. 首页重定向逻辑
修改首页/根路由,当已登录用户访问时,检查是否有上次阅读记录,有则直接重定向:
app.get('/', async (req, res) => { // 已登录且有阅读记录时,跳转至对应文章 if (req.isAuthenticated() && req.user.last_read_article) { return res.redirect(`/articles/${req.user.last_read_article}`); } // 未登录或无记录时,正常渲染首页(原有逻辑) const articles = await Article.find().limit(10); res.render('home', { articles }); });
3. 同步session中的用户信息
如果session存储的用户数据不包含last_read_article,需要在登录时同步该字段。以passport为例:
passport.serializeUser((user, done) => { done(null, { id: user._id, last_read_article: user.last_read_article }); }); passport.deserializeUser(async (obj, done) => { const user = await User.findById(obj.id); done(null, user); });
不用passport的话,就在登录成功后把
last_read_article存入req.session.user对象中。
三、前端(EJS)可选优化
如果需要给用户手动选择的机会,可在首页添加“继续阅读”提示:
// 首页路由修改(可选) app.get('/', async (req, res) => { let lastArticle = null; if (req.isAuthenticated() && req.user.last_read_article) { lastArticle = await Article.findById(req.user.last_read_article); // 这里可以注释掉自动重定向,让用户手动选择跳转 // return res.redirect(`/articles/${req.user.last_read_article}`); } const articles = await Article.find().limit(10); res.render('home', { articles, lastArticle }); });
在EJS模板中添加提示:
<% if (lastArticle) { %> <div class="last-read-tip"> 上次读到:<a href="/articles/<%= lastArticle._id %>"><%= lastArticle.title %></a>,点击继续阅读 </div> <% } %>
四、测试流程
- 登录用户,访问任意一篇文章(比如ID为4的文章)
- 关闭浏览器或退出页面
- 再次打开网站首页,应自动跳转到ID为4的文章详情页
- 未登录用户访问首页,正常显示首页内容
内容的提问来源于stack exchange,提问作者Change
相关产品推荐
相关产品推荐

