Могу ли я отправлять данные через функцию express next()?

Я работаю над webapp, который требует проверки подлинности и управления сеансом с помощью выражения. Я сделал это с помощью вспомогательных сессий. Теперь я хочу показать в пользовательском интерфейсе пользователя, который выполнил вход. PrivateContent - это функция, которая проверяет, зарегистрирован ли кто-то, например:

...
app.get( '/authRequired', queries.privateContent , routes.tasks );
...

Вот запрос .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 );
...

если да, то как я могу получить его, когда route.tasks render, если это происходит следующим образом (я пытаюсь получить данные в коде ниже, но он не работает.):

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

Как вы можете догадаться, мои намерения состоят в том, чтобы пройти через следующего текущего пользователя, который был подписан в модули маршрутизации, поэтому я могу напечатать имя пользователя в пользовательском интерфейсе с помощью jade. Спасибо за помощь.:)

Ответ 1

В этом случае у вас есть несколько вариантов (используйте только один из них!):

  • Вы можете просто получить доступ к переменной req.session.user.username из маршрута my_tasks
  • Вы можете использовать res.locals
  • Вы можете добавить данные в объект req

В вашей функции export.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('/');
  }
});

Затем в вашем маршруте export.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).
   });
};