如何将来自Connect中间件的variables传递给app.get-action?
我想创build一个之前的filter ,这使我可以使当前用户在所有行动中可用。 followint方法运作良好,我甚至不需要声明一个全局variables:
app.use(function(req, res, next){ if(req.session.user_id){ /* Get user from database and share it in a variable that can be accessed frooom ... */ User.find({ /* ... */ }, function(err, users){ if(users.length == 1){ req.current_user = users[0]; } next(); }); } else{ next(); } }); app.get('/', function(req, res){ // ... here!! console.log(req.current_user); res.render('index', { current_user: req.current_user, }); });
但是我仍然不确定是否可以操作req
因为我不知道是不是改变了我不属于我的东西是正确的? 有一个更好的方法吗?
使用会话或用户对象来扩展req是一种常见的方法
例如看这些例子:
-
护照,一个stream行的authentication库https://github.com/jaredhanson/passport/blob/master/lib/passport/strategies/session.js
-
连接中间件cookie会话https://github.com/senchalabs/connect/blob/master/lib/middleware/cookieSession.js
请继续前进,并要求物业要求! 当我刚开始使用Node.js和JavaScript的时候,我也觉得很奇怪(主要来自C ++的背景)。 然而,由于JavaScript的原型对象模型,这是非常自然的。 当你熟悉它之后,你会意识到你可以用简洁的代码来做强大的事情。
我是Passport的开发者(由上一位评论者提及)。 如果您打算开发可跨应用程序重用的中间件,那么我的build议是注意如何命名要添加到req
或res
的属性,以避免与同一应用程序中的其他中间件发生任何潜在冲突。
例如,Passport将user
设置为req.user
,但是提供了一个选项来改变它(例如,应用程序可以将其设置为req.currentUser
)。 内部私有variables附加到req._passport
属性。