我可以通过express next()函数发送数据吗?
我正在开发一个需要进行身份validation和会话pipe理的web应用程序。 我已经完成了后端会话的东西。 现在我想在UI上显示login的用户。privateContent是一个validation用户是否login的function,如下所示:
... app.get( '/authRequired', queries.privateContent , routes.tasks ); ...
这里是queries.privateContent:
... exports.privateContent = function ( req, res, next ) { if ( req.session.user ) { var username = req.session.user.username; User.findOne( { 'username': username }, function ( err, obj ) { if ( true ) { next(); } else { res.redirect('/'); } }); } else { res.redirect('/'); } }; ...
我想知道的是:我能发送这样的数据吗? :
... next( username ); ...
如果是这样,我怎么能得到它routes.tasks呈现时,如果发生如下(我试图获取下面的代码中的数据,但它不起作用。):
... exports.my_tasks = function ( req, res, data ) { console.log(data); res.render('tasks/tasks', { title: 'Paraíso', controller: 'MyTasksController', user: data }); }; ...
正如你所猜测的,我的意图是通过下一个login到路由模块的当前用户,所以我可以在用户界面使用玉打印用户名。 感谢您的帮助。 🙂
在这种情况下,你有几个select(只使用其中的一个!):
- 你可以从你的my_tasks路由中访问req.session.user.usernamevariables
- 你可以使用res.locals
- 您可以将数据添加到
req
对象
在exports.privateContent函数中,一旦在数据库中find用户,只需将该数据添加到res.locals即可:
User.findOne( { 'username': username }, function ( err, obj ) { if ( true ) { // this variable will be available directly by the view res.locals.user = obj; // this will be added to the request object req.user = obj; next(); } else { res.redirect('/'); } });
然后在你的res.locals.user
路由中, res.locals.user
将会是中间件中的任何东西。 然后你可以简单地在视图中以variablesuser
身份访问它。
所以,一起来,您可以通过以下方式访问路线中的数据:
exports.my_tasks = function ( req, res ) { res.render('tasks/tasks', { userFromReq: req.user, // this exists because you added in the middleware userFromSession: req.session.user, // this was already in the session, so you can access userFromRes: [DO NOT NEED TO DO THIS] // because res.locals are sent straight to the view (Jade). }); };