#node.js #express
#node.js #экспресс
Вопрос:
У меня есть некоторые переменные, которые будут использоваться на каждой динамической странице, как это используется в макете. Давайте назовем их user
и cities
. Для user
я следовал инструкции express по размещению промежуточного программного обеспечения напротив того места, где я бы его использовал, за исключением того, что я сделал это:
app.get('/*', function(req, res, next){
req.user = { name: "Kit" };
next();
});
Кажется, имеет смысл добавить user
on req
, но это немного ломается на cities
, поскольку, похоже, семантически не соответствует объекту req:
app.get('/*', function(req, res, next){
User.collection.distinct('city', function(err, response){
req.cities = response;
next();
});
req.menu = response;
});
За которым я затем следую:
app.get('/:city', function(req, res){
res.render('city', { cities: cities, user: user });
});
Есть ли лучший способ сделать это?
Ответ №1:
Я не вижу ничего ужасного в том, как вы это делаете, особенно для небольшой базы кода. Похоже, что города привязаны к пользователю, поэтому вы можете просто отключить города от req.user, выполнив req.user.cities = response
в вашем User.collection.distinct
обратном вызове. Другое дело, что вы запрашиваете эти города при каждом запросе. Это могло бы быть прекрасно, но если эти данные относительно статичны, использование сеансов и кэширование этих данных в течение срока службы сеанса имело бы смысл в качестве оптимизации.
Если вы хотите просто иметь более четкое имя, вы можете создать locals
объект верхнего уровня, отключить его от запроса, а затем отключить от него пользователя и города so req.locals.cities
.
Комментарии:
1. Города — это список всех городов для всех пользователей, но вы правы насчет их кэширования. Я подумал, что, поскольку у вас есть способ задать глобальные параметры просмотра через
app.set("view options" ... )
, возможно, я что-то упустил из виду, но, похоже, оформлениеreq.locals
— это правильный путь. Спасибо. 🙂