如何在Express中自动向所有render请求传递config.js的公共数据?
解决方案
有两种常用的轻量实现方案,不需要修改现有路由的render逻辑,只需要加几行全局配置即可:
方案1:使用应用级全局变量app.locals(最适合静态配置数据)
Express 内置的 app.locals 上挂载的变量,会自动注入到所有渲染模板的上下文里,无需每次手动传参,适合你这种从配置文件读取的固定数据。
只需要在所有路由注册前添加一行配置即可:
// 全局注入config数据,所有模板都能直接访问data变量 app.locals.data = require("config.js").coolData; // 后续路由不需要再手动传data app.get("/", (req, res) => { res.render("index"); }); app.get("/request2", (req, res) => { res.render("index"); }); app.get("/request3", (req, res) => { res.render("index", {foo}); // 仅需传递当前路由独有的参数 });
方案2:使用请求级全局变量res.locals(适合动态/和请求关联的数据)
如果你的公共数据需要根据请求动态调整(比如读取登录用户信息),可以注册一个全局中间件,把数据挂载到res.locals上,所有该请求后续的render调用都能自动拿到:
// 全局中间件,所有请求都会先执行这段逻辑 app.use((req, res, next) => { res.locals.data = require("config.js").coolData; // 也可以绑定动态数据,比如 res.locals.username = req.session.username next(); }); // 路由部分和方案1完全一致,不需要手动传data
注意
如果单个路由的render参数里出现了和全局变量重名的key,路由里传的参数优先级更高,会覆盖全局的变量值。
内容的提问来源于stack exchange,提问作者user16569720
相关产品推荐
相关产品推荐

