如何在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
相关产品推荐
相关产品推荐

