如何通过提交按钮/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
相关产品推荐
相关产品推荐

