node.js - 为每个请求传递参数

  显示原文与译文双语对照的内容
132 4

我使用 Passport 来验证我的用户,这一点没有问题。我的问题是通过每个页面请求一些要求的参数。

有一些方法可以完成它:

  • 使用 app.locals 存储变量,但它将对每个连接和不需要的信息都可用,这是一个风险。
  • 呈现页面时res.render('some_page', { params });你必须为每个请求加上这些额外的参数。params 对象在发送前将被修改。

我使用第二种方法,然后做了一个类似这样的全局函数:

GLOBAL.handleRes = function(req, data) {
 data.session = req.session;
 data.user = req.user;
 data.userToken = req.userToken;
 if (req.user && req.session) {
 data.session.user = req.user;
 }
 return data;
}

因此,对于每个注册 route,我必须使用这个 handleRes 来构建将发送到页面的最终 JSON 。

例如:

app.get('/project/list', function(req, res, next) {
//DO SOMETHING
 var pageJson = {
. . .
 }
 res.render('project_list.ejs', { handleRes(res, pageJson) });
};
app.get('/another/route', function(req, res, next) {
//SAME STRUCTURE FROM ABOVE
 res.render('another_route.ejs', { handleRes(res, pageJson) });
}

但是,我想避免这个问题,并且使用 handleRes() 自动为我的json参数进行表示。如何让它更容易,更简洁,更优雅?

谢谢!

## 更新 ##

Andreas帮了我,解决方法是:

app.use(function(req, res, next) {
 res.locals.user = null;
 res.locals.session = null;
 res.locals.userToken = null;
 if (req.user)
 res.locals.user = req.user;
 if (req.session) {
 res.locals.session = req.session;
 if (req.user)
 res.locals.session.user = req.user;
 }
 if (req.userToken)
 res.locals.userToken = req.userToken;
 next();
});
时间:原作者:1个回答

116 4

最好的方法是在路由前放置一个中间件,在 res.locals 上设置默认属性。Express将自动将这里对象的( 如果有的话,还扩展 app.locals ) 扩展到与 res.render() 一起发送的任何数据。例如:

//Put this before app.use(app.router) or any routes
app.use(function (req, res, next) {
 res.locals = {
 one: 1,
 two: 2
 };
 next();
});
//...
app.get('/', function (req, res) {
 res.render('view', {
 two: 3
 });
//Will render the view with { one: 1, two: 3 }
});
原作者:
...