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

如何通过提交按钮/input标签向Mongoose Schema插入收藏店铺数据

实现步骤&问题修复

1. 修复session配置(必改,否则会出现安全警告和功能异常)

原有session配置缺少必填的加密密钥字段,补充后代码如下:

app.use(session({
  secret: process.env.SESSION_SECRET || '自定义加密字符串', // 生产环境必须放到.env环境变量中存储
  resave: false,
  saveUninitialized: true,
}));

2. 修改stats.ejs模板的表单结构

需要在表单中新增隐藏字段传递当前店铺ID,否则后端无法识别要收藏的店铺:

<form action="/stats" method="post">
  <div class="stats-button">
    <!-- 新增隐藏input存储当前店铺ID -->
    <input type="hidden" name="journalId" value="<%=_id%>">
    <input type="submit" value="加入收藏" class="btn btn-primary">
  </div>
</form>

3. 修复POST /stats路由的逻辑错误

原有代码存在3个核心问题:

  • 不存在req.journal.id属性,收藏的店铺ID需要从表单提交的body中获取
  • 没有做用户登录状态校验,未登录用户点击收藏会触发报错
  • 没有做重复收藏校验,会导致同一个店铺ID多次存入用户收藏数组
    修改后代码如下:
app.post("/stats", function(req, res){
  // 先校验用户登录状态
  if(!req.isAuthenticated()){
    return res.redirect("/login"); // 跳转至你的项目登录页路径
  }
  // 从表单提交数据中获取店铺ID
  const favJournalId = req.body.journalId;
  User.findById(req.user.id, function(err, foundUser) {
    if (err) {
      console.log(err);
      return res.redirect("back"); // 出错返回上一页
    }
    if (foundUser) {
      // 判断是否已经收藏过该店铺,避免重复添加
      const isCollected = foundUser.journal.some(id => id.toString() === favJournalId);
      if(isCollected){
        return res.redirect("/favourite"); // 已收藏直接跳转
      }
      foundUser.journal.push(favJournalId);
      foundUser.save(function() {
        res.redirect("/favourite");
      });
    }
  });
});

4. 可选补充:收藏页展示已收藏店铺

如果需要在/favourite页面展示用户收藏的所有店铺,可以使用populate关联查询实现:

app.get("/favourite", function(req, res){
  if(!req.isAuthenticated()){
    return res.redirect("/login");
  }
  User.findById(req.user.id).populate("journal").exec(function(err, foundUser){
    if(err){
      console.log(err);
      return res.redirect("back");
    }
    res.render("favourite", {
      journals: foundUser.journal // 模板中遍历journals数组即可展示所有收藏的店铺
    });
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 09:45:00