кэш экспресс-представления, действующий смешно

Я наткнулся на некоторые забавные вещи с кешем представления в Express / Jade. Контроллер получает статью из MongoDB через Mongoose и передает ее функции res.render. Однако после нескольких минут работы Express начинает обслуживать один и тот же скомпилированный шаблон для всех запросов на этот маршрут. Это даже случается с общими включениями .jade, которые используются в различных шаблонах.

База данных выбирает правильные статьи и неНе имеет значения, если я передам несколько случайных строк в шаблон, я всегда получаю один и тот же вывод.

Это функция контроллера:

exports.show = function(req, res) {
  var articleId;
  articleId = req.params.id;
  Article.findOne({
    _id: articleId
  }).populate('author').exec(function(err, article) {
    if (err) {
      console.log(err);
    } else {
      res.render('articles/show', {
        article: article,
        articleId: article.id
      });
    }
  });
};

И этоS маршрут:

app.get('/articles/:id', articles.show);

То же самое происходит ли ям работает в режиме производства или разработки.

Кто-нибудь сталкивался с такими неприятностями с Express / Jade?

 Pradeep Mahdevu30 сент. 2013 г., 20:40
Я согласен с @robertklep. Я думаю, это ваш прокси, который кеширует. Можете ли вы проверить заголовки ответа, если вы видите какой-либо заголовок кэша? Также попробуйте установить следующие заголовки на стороне сервера. Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Срок действия истекает: 0 Посмотрите, подходит ли это вам?stackoverflow.com/questions/49547/...
 robertklep04 июн. 2013 г., 21:31
С "тот же скомпилированный шаблонВы имеете в виду то же самое?оказываемых шаблон? Я'я не уверенкэш представления, так какне активен при запуске в режиме разработки (если вы явно не включили его?). Кроме того, кэш представления хранит только скомпилированные (но не обработанные) шаблоны, они все равно будут отображаться отдельно для каждого запроса. Как выглядит настройка вашего приложения? Любое другое промежуточное программное обеспечение (или, возможно, прокси-сервер перед Node), которое может вызвать проблему?

Ответы на вопрос(2)

TL; DR: попробуй

let articleId;

вместо я

var articleId;

Я просто еще один новичок в Node.js, но ямы только что решили ту же проблему, подставиввар» ключевое слово дляпозволять", Дело в том, чтовар» создает переменную, ограниченную функцией, тогда как "позволять" - область действия до текущего блока один. Он создается заново каждый раз, когда выполняется блок, что важно из-за асинхронного характера Node.js.

Изменить: Обратите внимание, что кэш представления экспресс-наборов включен для производства: см.экспресс документы

кеш представления Включает кэширование компиляции шаблона представления, по умолчанию включено в производство

Попробуйте добавить эту строку в разделе конфигурации вашего приложения:

app.disable('view cache');

Кроме того, попробуйте добавить заголовки контроля кэша

res.setHeader('Cache-Control', 'no-cache');
res.render('articles/show', {
...

Отw3.org документы:

Cahce-Control

Поле общего заголовка Cache-Control используется для указания директив, которым ДОЛЖНЫ подчиняться все механизмы кэширования в цепочке запросов / ответов. Директивы определяют поведение, предназначенное для предотвращения неблагоприятного вмешательства кэшей в запрос или ответ. Эти директивы обычно переопределяют алгоритмы кэширования по умолчанию. Директивы Cache являются однонаправленными в том смысле, что наличие директивы в запросе не означает, что в ответе должна быть указана та же директива.

Если вам нужен более продвинутый элемент управления, рассмотрите другие поля, такие как max-age,этот вопрос также хороший ресурс, выВы увидите, что разные браузеры могут реализовывать этот rfc немного по-разному.

 MikeSmithDev29 окт. 2013 г., 17:39
Да, я думаю, мне придется пойти по этому пути.
 alfonsodev29 окт. 2013 г., 17:18
Хорошо, я понимаю вашу точку зрения, заголовок не только для кэша браузера, представьте, что у вас есть Varnish в производстве, или у вашего DNS есть механизм кэширования, такой как Cloudflare, этот заголовок в ответе должен соблюдаться по всей цепочке. Но я понимаю вашу точку зрения. Тогда я бы заменил jade на hbs или другой, чтобы отказаться от этой проблемы с движком шаблонов. Или посмотрите репозиторий Jade, чтобы узнать, есть ли известные проблемы с кешем.
 MikeSmithDev20 нояб. 2013 г., 16:32
Продолжение: я в конечном итоге просто сDot.
 MikeSmithDev29 окт. 2013 г., 16:58
Кэширование браузера нет проблема. Скажем, я смотрю на четыре разных поста в блоге. Через некоторое время все URL начнут доставлять одну и ту же запись в блоге. Это'Например, Джейд кеширует шаблон и не использует объект, который я ему передаю ... Он просто использует последние известные значения.

Ваш ответ на вопрос