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