You need to enable JavaScript to run this app. Node.js+Express+EJS项目中复用的侧边栏partial如何统一传参?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 17:30:04