使用Node.js+Pug开发时,登录态判断放模板还是路由渲染不同模板?
两种实现方案的对比&选择建议
1. 模板内做条件判断(你当前的实现方式)
- 优势
- 复用性高:如果登录前后页面大部分布局共用(比如顶部导航、底部页脚都继承自同一个layout),只需要修改内容块的差异部分,不用维护两套高度重复的模板,后续修改公共布局只需要改一次,不会出现两边同步出错的问题
- 逻辑聚合:登录状态对应的展示差异直接写在对应模板里,后续调整展示逻辑不用跳转路由文件查找,维护更方便
- 劣势
- 如果登录前后页面结构差异极大、几乎没有公共内容,模板内的条件判断会变得非常冗长,可读性会下降
- 适用场景:你当前开发的酒店预订首页完全适配这种方案,登录前后只是内容块不同,整体布局都继承自同一个layout,继续用这个方案就可以
注意你当前代码有个小优化点:不要用全局
user变量存储登录状态,多用户访问时很容易出现状态串用的问题,建议通过render参数主动把登录状态传给模板,参考修改后的路由代码:
app.get('/', (req, res) => { User.find({}, function(err, users) { if(err) { console.log(err); return res.status(500).send('服务异常'); } // 假设用express-session存储登录状态,主动传递user变量到模板 res.render("index", { title: "Willkommen", users: users, user: req.session.user || null }); }); });
2. 路由判断拆分渲染独立模板
- 优势
- 两个模板完全独立,逻辑互不干扰,适合登录前后页面设计完全不同、几乎没有公共内容的场景,代码逻辑更清爽
- 劣势
- 公共布局修改时需要同步改两个模板,很容易漏改出现不一致的问题,维护成本更高
- 路由层需要处理本属于视图层的展示逻辑,不符合逻辑分层原则,路由层应该只处理数据获取、权限校验这类业务逻辑,展示逻辑尽量收敛在模板层
最终建议
你当前的场景直接沿用模板内条件判断的方案即可,只要把全局user变量的问题优化下就完全满足需求,后续如果业务迭代,登录前后首页差异变得极大的时候,再考虑拆分路由渲染两个独立模板也不迟。
内容的提问来源于stack exchange,提问作者bigfatbird
相关产品推荐
相关产品推荐

