You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express.js中实现中间件向EJS视图传递数据

Express中间件与EJS视图通信实现方案

你可以通过Express内置的res.locals对象完成数据传递,这是专门用来给视图层传全局变量的属性,挂载后所有EJS模板都可以直接读取,具体实现步骤如下:

1. 在独立中间件中挂载主题状态

在你的主题检查中间件文件里,把判断结果挂载到res.locals上即可:

// /middleware/checkTheme.js 你的独立中间件文件
module.exports = (req, res, next) => {
  // 直接把判断结果挂载到res.locals,变量名可以自定义
  res.locals.enableDarkMode = req.cookies?.theme === 'dark';
  // 执行next()放行后续逻辑
  next();
}

注意:需要提前安装并注册cookie-parser中间件才能正常读取req.cookies,否则会拿到undefined。

2. 注册中间件到Express实例

在项目入口文件(通常是app.js/index.js)中注册中间件,必须放在cookie-parser注册之后:

const express = require('express');
const cookieParser = require('cookie-parser');
const checkTheme = require('./middleware/checkTheme');
const app = express();

// 先注册cookie解析中间件
app.use(cookieParser());
// 全局注册主题检查中间件,所有路由都会触发
app.use(checkTheme);

// 其他配置,比如EJS视图引擎注册、路由配置
app.set('view engine', 'ejs');
// 你的路由代码...

如果不需要全局生效,也可以只给需要的路由单独挂载中间件,写法为app.get('/xxx', checkTheme, (req,res) => {})。

3. EJS模板中直接读取变量

你可以在任意EJS模板中直接使用刚才挂载的变量,比如给body加类名:

<!-- 比如公共头部模板layout.ejs -->
<body class="<%= enableDarkMode ? 'dark' : '' %>">
  <!-- 页面内容 -->
</body>

如果需要在前端JS中使用这个状态,可以这么写:

<script>
// 用<%- 不转义输出,避免JSON引号被转义
const isDarkMode = <%- JSON.stringify(enableDarkMode) %>;
</script>

内容的提问来源于stack exchange,提问作者mercury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:48:03