Миграция Express.js с 2 по 3, в частности app.dynamicHelpers() в app.locals.use?
Обновлен Express.js с версии 2 по 3, и следующий вызов app.dynamicHelpers({..})
сломался, поскольку он больше не присутствует в V3:
app.dynamicHelpers({
request: function(req){
return req
},
...etc.
});
Там руководство по миграции, в котором говорится следующее:
-
app.dynamicHelpers()
(используйте промежуточное ПО + res.locals)
Но я в тупике, как это сделать. Есть ли более конкретный пример того, как перенести это?
Связанная публикация SO: nodejs express 3.0
Ответы
Ответ 1
У меня была такая же проблема с session.user, и я просто исправил ее, понимая, что функция app.use должна быть IN частью конфигурации, а не там, где она была раньше.
До:
app.configure();
app.dynamicHelpers({
user: function(req, res) {
return req.session.user;
}
});
После:
app.configure(function(){
//...
app.use(function(req, res, next){
res.locals.user = req.session.user;
next();
});
//...
});
для Flash смотрите connect-flash
Ответ 2
Решение с 16 голосами правильное, но обязательно используйте назначение res.locals
до
app.use(app.router);
обратитесь к этому сообщению fooobar.com/questions/288628/...
Ответ 3
reponse.locals.use - это новая полезная функция Express, которая позволяет отправлять переменную в вашу модель, которая сначала должна быть оценена. Скажем, например, вы хотите отправить 3 переменные в ваше представление, все из которых должны появиться после запроса на mongodb. "Старый" способ состоял в том, чтобы вложить 3 обратных вызова, и когда последний вернется, вы будете отображать свое мнение. locals.use делает это намного проще, так как он будет оценивать ваши функции и отобразит ваше мнение только тогда, когда все будут оценены.
Вот короткий фрагмент кода о том, как их использовать (это кофе script, надеюсь, вы можете преобразовать его в javascript: D)
response.locals.use (request, response, done) ->
myAsynchMethod (value) ->
reponse.locals.myProperty = value
done()
В этом случае будет существовать переменная с именем myProperty, которую вы можете использовать в своем представлении, которая имеет значение, установленное для того, что myAsynchMethod дал обратный вызов.
Ответ 4
Посмотрите папку примеров в github. Например auth:
app.use(function(req, res, next){
var err = req.session.error,
msg = req.session.success;
delete req.session.error;
delete req.session.success;
res.locals.message = '';
if (err) res.locals.message = '<p class="msg error">' + err + '</p>';
if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>';
next();
});
Затем вы можете использовать переменную "сообщение" в своем шаблоне.