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

基于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>
<% } %>

四、测试流程

  1. 登录用户,访问任意一篇文章(比如ID为4的文章)
  2. 关闭浏览器或退出页面
  3. 再次打开网站首页,应自动跳转到ID为4的文章详情页
  4. 未登录用户访问首页,正常显示首页内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:35:23