Node.js+Express+EJS项目中复用的侧边栏partial如何统一传参?
Express+EJS项目侧边栏全局传参解决方案
该需求完全可以实现,Express框架原生支持全局模板变量注入能力,无需每个路由手动传递公共参数。
核心原理
Express 提供两个模板全局变量挂载对象:
res.locals:作用域为单次请求,注入的变量仅对当前请求的渲染模板生效,非常适合存储user这类每个用户不同的会话数据app.locals:全局作用域,注入的变量对所有请求的所有模板生效,适合存储站点名称、静态配置这类全站点统一的参数
具体实现步骤
方案1:挂载到现有登录校验中间件(推荐)
你当前需要侧边栏的路由都已经引入了authMiddleware.checkAuth中间件,直接修改该中间件,把用户数据挂载到res.locals即可:
// authMiddleware.js 修改后的checkAuth逻辑 const checkAuth = (req, res, next) => { // 保留你原有登录校验逻辑 // 新增挂载user到模板全局变量 res.locals.user = req.session?.user || null; next(); };
方案2:新增独立全局中间件
如果不想修改原有校验逻辑,可以在Express入口文件(通常为app.js/index.js)的路由注册前,新增一个全局中间件:
// app.js 路由注册前添加 app.use((req, res, next) => { res.locals.user = req.session?.user || null; next(); });
改造后的路由代码
完成上述配置后,所有路由的res.render都不需要再手动传递user参数,原有逻辑完全兼容:
router.get("/", authMiddleware.checkAuth, (req, res) => { res.render("app/index"); // 无需再传user }); router.get("/system/users", authMiddleware.checkAuth, (req, res) => { res.render("app/system/users"); // 无需再传user });
你原有侧边栏partial的代码不需要做任何修改,仍然可以直接使用user变量正常渲染。
注意事项
res.locals的变量仅对模板渲染生效,不会影响接口返回JSON的逻辑- 如果有部分页面不需要侧边栏也不需要
user变量,也不会产生额外影响,模板里未使用的变量不会报错
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

