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)
)
Ответы
Ответ 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}