Есть ли удобный способ оформить параметры просмотра в несколько этапов в Express?

#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 — это правильный путь. Спасибо. 🙂