我可以通过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(只使用其中的一个!):

  1. 你可以从你的my_tasks路由中访问req.session.user.usernamevariables
  2. 你可以使用res.locals
  3. 您可以将数据添加到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). }); };