表达视图缓存表现有趣

Óla*_*sen 11 node.js express pug

我正在使用express/Jade中的视图缓存遇到一些有趣的东西.控制器通过Mongoose从MongoDB获取文章并将其交给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
      });
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

这就是路线:

app.get('/articles/:id', articles.show);
Run Code Online (Sandbox Code Playgroud)

无论我是在生产模式还是在开发模式下运行,都会发生同样的事情.

有没有人用Express/Jade遇到这种情况?

alf*_*dev 8

编辑:请注意,express为生产启用了视图缓存:请参阅express docs

view cache启用视图模板编译缓存,默认情况下在生产中启用

尝试在您的应用配置部分添加此行:

app.disable('view cache');
Run Code Online (Sandbox Code Playgroud)

另外,尝试添加缓存控制标头

res.setHeader('Cache-Control', 'no-cache');
res.render('articles/show', {
...
Run Code Online (Sandbox Code Playgroud)

来自w3.org文档:

Cahce-控制

Cache-Control通用头字段用于指定请求/响应链中的所有缓存机制必须遵守的指令.指令指定旨在防止高速缓存对请求或响应产生负面干扰的行为.这些指令通常会覆盖默认的缓存算法.缓存指令是单向的,因为请求中存在指令并不意味着在响应中给出相同的指令.

如果你需要一个更高级的控件,考虑其他字段,如max-age,这个问题也是一个很好的资源,你会发现不同的浏览器可能会实现这个rfc略有不同.