我可以通过express next()函数发送数据吗?

Ale*_*rdi 12 session routing node.js express

我正在开发一个webapp,需要使用express进行身份验证过程和会话管理.我已经完成了后端会话.现在我想在UI上显示已登录的用户.envateContent是一个验证某人是否已登录的函数,如下所示:

...
app.get( '/authRequired', queries.privateContent , routes.tasks );
...
Run Code Online (Sandbox Code Playgroud)

这是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('/');
  }
};
...
Run Code Online (Sandbox Code Playgroud)

我想知道的是:我能够发送这样的数据吗?:

...
next( username );
...
Run Code Online (Sandbox Code Playgroud)

如果是这样,我如何在routes.tasks渲染时检索它,如果发生如下(我正在尝试获取下面代码中的数据,但它不起作用.):

...
exports.my_tasks = function ( req, res, data ) {
      console.log(data);
      res.render('tasks/tasks',
                  { title: 'Paraíso', controller: 'MyTasksController', user: data });
};
...
Run Code Online (Sandbox Code Playgroud)

您可以猜测,我的意图是通过下一个登录到路由模块的当前用户,因此我可以使用jade在UI中打印用户名.谢谢您的帮助.:)

Ben*_*ett 24

在这种情况下,您有几个选项(只使用其中一个!):

  1. 您只需从my_tasks路由访问req.session.user.username变量即可
  2. 您可以使用res.locals
  3. 您可以向req对象添加数据

在exports.privateContent函数中,一旦在数据库中找到用户,您只需将该数据添加到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('/');
  }
});
Run Code Online (Sandbox Code Playgroud)

然后在您的exports.my_tasks路由中,res.locals.user将是中间件中的任何obj.然后,您只需在视图中访问该变量即可user.

因此,您可以通过以下方式访问路线中的数据:

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).
   });
};
Run Code Online (Sandbox Code Playgroud)