expression视图caching表演有趣

我遇到了一些有趣的东西,用express / Jade的视图caching。 控制器通过Mongoose从MongoDB中获取文章,并将其传递给res.render函数。 但是,运行了几分钟后,Express开始为该路由的所有请求提供相同的编译模板。 这甚至发生共享.jade包括在各种模板中使用。

数据库正在提取正确的文章,如果我传递一些随机string到模板并不重要,我总是得到相同的输出。

这是控制器function:

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的?

编辑:请注意,快递集视图caching启用生产:请参阅快速文档

视图caching启用视图模板编译caching,默认在生产环境中启用

尝试在你的应用程序configuration部分添加这一行:

 app.disable('view cache'); 

另外,尝试添加caching控制标题

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

从w3.org文档:

Cahce-控制

Cache-Control通用头字段用于指定请求/响应链上的所有caching机制必须遵守的指令。 该指令指定旨在防止caching不利地干扰请求或响应的行为。 这些指令通常覆盖默认的cachingalgorithm。 Cache指令是单向的,因为在请求中存在指令并不意味着在响应中给出相同的指令。

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

TL; DR:尝试

 let articleId; 

代替

 var articleId; 

我只是Node.js的另一个newbro,但我刚刚通过用“var”关键字replace“let”来解决同样的问题。 事情是“var”创build一个函数作用域的variables,而“let” – 作用域到当前块。 每次执行块时都会重新创build,由于Node.js的asynchronous性质,这一点非常重要。