2013-06-04 87 views
11

我遇到了一些有趣的东西与视图缓存在快递/翡翠。控制器通过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

使用“相同的编译模板”,你的意思是相同的*渲染*模板?我不确定它是否是视图缓存,因为在开发模式下运行时它不是主动的(除非你明确地启用了它)?此外,视图缓存仅存储已编译(但未呈现)的模板,它们仍将针对每个请求单独呈现。你的应用安装程序是什么样的?任何其他中间件(或者可能是Node前的代理服务器)都可能导致此问题? – robertklep

+1

我同意@robertklep。我猜它是你的缓存代理。如果你看到任何缓存头,你能检查响应头吗?另外,请尝试在服务器端设置以下标题。 缓存控制:无缓存,无店铺,必重新验证 杂注:无缓存过期 :0 看看是否能为你的作品HTTP://stackoverflow.com/questions/49547/making-确保Web页面不被缓存 - 跨浏览器 –

回答

7

编辑: 注意表达套查看生产允许缓存: 看到express docs

视图缓存启用视图模板编译缓存,默认情况下在 生产允许

尝试加入这一行在您的应用配置部分:

app.disable('view cache'); 

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

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

w3.org文档:

Cahce-控制

缓存控制通用头字段用于指定指令 必须遵循 请求/响应链上的所有缓存机制。该指令指定旨在防止缓存不利于请求或 响应的行为。这些指令通常会覆盖默认缓存算法。 Cache指令是单向的,因为请求中指令的存在 并不意味着要在响应中给出相同的指令 。

如果你需要一个更先进的控制,考虑其他领域,如最大年龄,this question也是一个很好的资源,你会看到不同的浏览器可以实现这个RFC略有不同。

+0

浏览器缓存不是问题。说我看看四个不同的博客文章。稍后,所有网址将开始提供相同的博客文章。这就像玉缓存模板,并不打扰使用我传递给它的对象......它只是使用最后已知的值。 – MikeSmithDev

+0

好吧,我明白了你的观点,标题不仅仅针对浏览器缓存,想象你在制作一个Varnish,或者你的DNS有一个像Cloudflare一样的缓存机制,响应中的这个头必须遵守这个链。但我明白你的观点。 然后,我会替换玉或hbs或其他放弃这是一个模板引擎问题。或者看看Jade回购看看是否存在已知的缓存问题。 – alfonsodev

+0

是的,我想我必须走这条路。 – MikeSmithDev

2

TL; DR:尽量

let articleId; 

代替

var articleId; 

我只是一个newbro到Node.js的,但我刚下代以 “无功” 解决了同样的问题“let”的关键字。事情是“var”创建一个函数作用域的变量,而“let” - 作用域为当前块。每次执行块时都会重新创建,由于Node.js的异步特性,这非常重要。