Экспресс-просмотр кэша

Я запускаю некоторые забавные вещи с кешем представления в 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
      });
    }
  });
};

И что маршрут:

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

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

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

Ответ 1

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

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

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

app.disable('view cache');

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

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

Из w3.org docs:

Cahce-Control

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

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

Ответ 2

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

let articleId;

вместо

var articleId;

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