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性质,这一点非常重要。