如何将公共变量从 app.js 渲染到 express 中的所有路由
how to render common variables from app.js to all routes in express
在我的 Node.js 应用程序中,一些渲染的变量或每条路线都是 common.There 大约有 4-5 个变量在每条路线上渲染。我有大约 20 条路线。
目前我正在 res.render
中的每条路线中传递这些变量
有没有一种方法可以让我在某个地方传递这些公共变量'(eg:app.js)`,每个路由都在使用它,这样我就可以稍微清理一下我的代码。
我对节点使用 express.js
,对模板使用 handlebars
。
编辑:我想我应该多解释一下
res.render('abc', {
commonitem1: 'one',
commonitem2: 'two',
...
});
-------------------------------------
another route
res.render('xyz', {
commonitem1: 'one',
commonitem2: 'two',
...
});
我想避免在我的每条路线中重复这种情况,并希望从一个共同的地方呈现它。
似乎 res.locals 就是您要找的东西 - 这个对象会针对每个请求传递给您的视图,并且范围限定为每个单独的请求(即每个请求都可以有自己的版本 res.locals
).还有 app.locals
为所有请求共享。
我没有这方面的实践经验,但您可以使用此对象将 所有 变量传递给您的视图,或者 Express 可能会合并 [=11= 中的任何内容] 使用 res.locals
以及您通过 res.render()
发送到视图的内容。请仔细测试,我没有在官方文档中找到有关合并行为的相关信息。
至于填充 res.locals
,在执行实际路由逻辑之前保留填充对象的代码 DRY, you can write a custom middleware。
您可以使用以下代码创建一个 constants.js 文件
(function (constants) {
var FetchDataErrorMessage = "Error while fetching User Data";
var ConnectionErroMessage = "Error while fetching Connecting Server";
var InsertDataErrorMessage = "Error while inserting User Data";
var RemoveDataErrorMessage = "Error while removing User Data";
var UpdateDataErrorMessage = "Error while updating User Data";
})(module.exports);
在任何需要使用这些变量的文件中,您可以添加以下代码。
var constants = require('constants');
console.write(constants.RemoveDataErrorMessage);
Output :- "Error while removing User Data"
对于会话或请求相关值,您可以将这些公共值存储在全局变量中,然后直接在 res.render 中使用它们。为此,您有以下选项
- 使用app.use存储值:
在您的 app.js 中添加一个为您执行此操作的中间件。请记住在您定义的任何其他路由之前编写此中间件,因为中间件功能是按顺序执行的。
app.use(function(req, res, next){
res.locals.items = "Value";
next();
});
//your routes follow
app.use(‘/’, home);
在您的路线中,您可以将 items
直接放在 res.render 中,例如:
res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items });
- 使用 express-session 存储值:
如果您安装了 express-session,您可以在 req.session.item
中保存一些数据并将它们放在任何路径中,例如:
res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items });
// I created common func for all routes as below.
function commonRes(layout, req, res) {
if (req.session.user) {
res.render(layout, {
user: req.session.user
//csrfToken: req.csrfToken() // csrf
})
} else {
res.render(layout, {
user: null,
csrfToken: null
})
}
return res.end()
}
// and apply it to all routes simply as below
app.get('/', (req, res) => {
return commonRes('index.html', req, res)
})
app.get('/new', (req, res) => {
return commonRes('new.html', req, res)
})
在我的 Node.js 应用程序中,一些渲染的变量或每条路线都是 common.There 大约有 4-5 个变量在每条路线上渲染。我有大约 20 条路线。
目前我正在 res.render
有没有一种方法可以让我在某个地方传递这些公共变量'(eg:app.js)`,每个路由都在使用它,这样我就可以稍微清理一下我的代码。
我对节点使用 express.js
,对模板使用 handlebars
。
编辑:我想我应该多解释一下
res.render('abc', {
commonitem1: 'one',
commonitem2: 'two',
...
});
-------------------------------------
another route
res.render('xyz', {
commonitem1: 'one',
commonitem2: 'two',
...
});
我想避免在我的每条路线中重复这种情况,并希望从一个共同的地方呈现它。
似乎 res.locals 就是您要找的东西 - 这个对象会针对每个请求传递给您的视图,并且范围限定为每个单独的请求(即每个请求都可以有自己的版本 res.locals
).还有 app.locals
为所有请求共享。
我没有这方面的实践经验,但您可以使用此对象将 所有 变量传递给您的视图,或者 Express 可能会合并 [=11= 中的任何内容] 使用 res.locals
以及您通过 res.render()
发送到视图的内容。请仔细测试,我没有在官方文档中找到有关合并行为的相关信息。
至于填充 res.locals
,在执行实际路由逻辑之前保留填充对象的代码 DRY, you can write a custom middleware。
您可以使用以下代码创建一个 constants.js 文件
(function (constants) {
var FetchDataErrorMessage = "Error while fetching User Data";
var ConnectionErroMessage = "Error while fetching Connecting Server";
var InsertDataErrorMessage = "Error while inserting User Data";
var RemoveDataErrorMessage = "Error while removing User Data";
var UpdateDataErrorMessage = "Error while updating User Data";
})(module.exports);
在任何需要使用这些变量的文件中,您可以添加以下代码。
var constants = require('constants');
console.write(constants.RemoveDataErrorMessage);
Output :- "Error while removing User Data"
对于会话或请求相关值,您可以将这些公共值存储在全局变量中,然后直接在 res.render 中使用它们。为此,您有以下选项
- 使用app.use存储值:
在您的 app.js 中添加一个为您执行此操作的中间件。请记住在您定义的任何其他路由之前编写此中间件,因为中间件功能是按顺序执行的。
app.use(function(req, res, next){
res.locals.items = "Value";
next();
});
//your routes follow
app.use(‘/’, home);
在您的路线中,您可以将 items
直接放在 res.render 中,例如:
res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items });
- 使用 express-session 存储值:
如果您安装了 express-session,您可以在 req.session.item
中保存一些数据并将它们放在任何路径中,例如:
res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items });
// I created common func for all routes as below.
function commonRes(layout, req, res) {
if (req.session.user) {
res.render(layout, {
user: req.session.user
//csrfToken: req.csrfToken() // csrf
})
} else {
res.render(layout, {
user: null,
csrfToken: null
})
}
return res.end()
}
// and apply it to all routes simply as below
app.get('/', (req, res) => {
return commonRes('index.html', req, res)
})
app.get('/new', (req, res) => {
return commonRes('new.html', req, res)
})