使用Mongoose findById渲染Flash游戏详情页时动态展示热门游戏问题
在Flash游戏详情页展示热门游戏的实现方案
嘿,我来帮你搞定这个需求!要在详情页同时展示当前游戏和热门游戏,我们只需要调整路由逻辑,同时获取两类数据,再在模板里渲染就行,具体步骤如下:
1. 修改路由,同时获取当前游戏与热门游戏
目前你的路由只查询了当前点击的游戏,我们需要新增一个查询来获取热门游戏数据。用Promise.all并行执行两个查询,效率更高,不会互相阻塞:
router.get("/oyun/:gameNameId", (req, res) => { // 并行执行两个数据库查询 Promise.all([ // 查询当前点击的游戏详情 gameName.findById(req.params.gameNameId), // 查询热门游戏:这里假设按浏览量降序取前5个,你可以根据实际规则调整 gameName.find().sort({ views: -1 }).limit(5) ]) .then(([currentGame, popularGames]) => { // 处理当前游戏不存在的情况 if (!currentGame) { return res.status(404).send("抱歉,该游戏不存在!"); } // 将两类数据都传给模板 res.render("showGame", { gamesInfo: currentGame, popularGames: popularGames }); }) .catch((err) => { console.error("加载游戏数据出错:", err); res.status(500).send("服务器加载数据失败,请稍后重试"); }); });
热门游戏查询的自定义调整:
- 如果你的热门游戏是通过
isPopular字段标记的,把查询改成:gameName.find({ isPopular: true }).limit(5) - 要是想按用户评分排序,就改成:
gameName.find().sort({ rating: -1 }).limit(5) - 完全可以根据你的业务规则自定义查询条件,只要符合Mongoose的语法就行
2. 在EJS模板中渲染热门游戏
现在模板里已经拿到了popularGames数组,用EJS的循环语法遍历渲染即可,比如在详情页的合适位置添加这段代码:
<!-- 热门游戏区域 --> <section class="popular-games-section"> <h2>🔥 热门游戏</h2> <div class="games-grid"> <% if (popularGames.length > 0) { %> <% popularGames.forEach(game => { %> <a href="/oyun/<%= game._id %>" class="game-card"> <img src="<%= game.thumbnail %>" alt="<%= game.name %>" class="game-thumbnail"> <p class="game-title"><%= game.name %></p> </a> <% }) %> <% } else { %> <p class="no-games">暂无热门游戏推荐</p> <% } %> </div> </section>
额外提示:
- 确保模板里用到的字段(比如
game.thumbnail、game.name)和你的Mongoose模型字段一致,别写错名字 - 可以根据网站的UI设计调整HTML结构和CSS样式,让热门游戏展示更美观
- 如果热门游戏更新不频繁,还可以给热门游戏查询加个缓存(比如用Redis),减少数据库压力,提升页面加载速度
内容的提问来源于stack exchange,提问作者Adrian Marica
相关产品推荐
相关产品推荐

