Подтвердить что ты не робот

ExpressJS 3.0 Как передать res.locals в виде нефрита?

Я хочу отобразить флэш-сообщение после того, как пользователь не выполнит вход, но я просто не могу заставить переменные отображаться в моих представлениях Jade.

У меня есть несколько частей, я знаю, что должен использовать это в своем app.configure():

    app.use (req, res, next) ->
      res.locals.session = req.session

И я установлю, что сообщение флэш-сообщения после того, как пользователь ОТПРАВЛЯЕТ неправильный пароль:

     exports.postSession = (req, res) ->
       users = require '../DB/users'
       users.authenticate(req.body.login, req.body.password, (user) ->
       if(user)
         req.session.user = user
         res.redirect(req.body.redirect || '/')
       else
         req.session.flash = 'Authentication Failure!'
         res.render('sessions/new', {title:'New', redirect: req.body.redirect })
      )

Я не знаю, как получить доступ к res.locals.session в моем файле Jade. Я сомневаюсь, что все правильно. Этот вопрос очень похож на этот: Перенос Express.js с 2 по 3, в частности app.dynamicHelpers() в app.locals.use?, но я все еще не могу заставить его работать. Было бы очень признательно, если бы кто-нибудь мог показать мне простой пример установки значений в res.local и доступа к ним в представлении.

p.s. Я знаю о connect-flash, но мне нужно понять, как сделать вещи доступными в представлениях.

Это мое приложение:

app.configure(() -> 
  app.set('views', __dirname + '/views')
  app.set('view engine', 'jade')
  app.use(express.bodyParser())
  app.engine('.jade', require('jade').__express)
  app.use(express.methodOverride())
  app.use(express.cookieParser())
  app.use(express.session({ store: new express.session.MemoryStore({reapInterval: 50000 * 10}), secret: 'chubby bunny' }))
  app.use(express.static(__dirname + '/public'))
  app.use((req, res, next) ->
    res.locals.session = req.session
    next()
  )
  app.use(app.router)
)
4b9b3361

Ответ 1

Просто, чтобы дать краткое резюме для всех, кто имеет ту же проблему, и получил впечатление, что было решено изменить res.redirect.

Очень важно разместить ваше app.use промежуточное ПО до app.router. См. Комментарии TJ Holowaychuck, автора выражения

Ниже приведен пример использования новой версии express v3.0.0rc4

app.js:

app.use(function(req, res, next){
  res.locals.variable = "some content";
  next();
})

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

index.jade:

extends layout

block content
  h1= title
  p Welcome to #{title}
  p= variable

Ответ 2

Если вы используете express.session(), вы должны вызвать свою функцию ПОСЛЕ express.session(), но ПЕРЕД app.router, внутри app.configure().

app.js

app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.session());

  // Give Views/Layouts direct access to session data.
  app.use(function(req, res, next){
    res.locals.session = req.session;
    next();
  });

  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

index.jade

extends layout

block content   
  h1= title   
  p My req.session.var_name is set to #{session.var_name}