表达视图缓存表现有趣

时间:2013-06-04 16:19:35

标签: 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
      });
    }
  });
};

这就是路线:

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

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

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

2 个答案:

答案 0 :(得分:8)

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

  

view cache启用视图模板编译缓存,启用   默认生产

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

app.disable('view cache');

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

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

来自w3.org docs:

  

<强> Cahce-控制

     

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

如果您需要更高级的控件,请考虑其他字段,例如max-age,this question也是一个很好的资源,您会看到不同的浏览器可能会实现此rfc略有不同。

答案 1 :(得分:2)

TL; DR:尝试

let articleId;

而不是

var articleId;

我只是Node.js的另一个新人,但我通过替换&#34; var&#34;来解决同样的问题。关键字为&#34;让&#34;。问题是&#34; var&#34;创建一个由函数作用的变量,而&#34; let&#34; - 范围为当前块1。每次执行块时都会重新创建,这很重要,因为Node.js具有异步性。