快速查看缓存表现得很有趣

2024-06-25

我在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 时遇到过这种麻烦吗?


编辑: 请注意,express 设置了为生产启用的视图缓存: 看快速文档 http://expressjs.com/api.html

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

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

app.disable('view cache');

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

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

From w3.org http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html docs:

缓存控制

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

如果您需要更高级的控制,请考虑其他字段,例如 max-age,这个问题 https://stackoverflow.com/questions/1046966/whats-the-difference-between-cache-control-max-age-0-and-no-cache也是一个很好的资源,你会发现不同的浏览器对这个 rfc 的实现可能略有不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速查看缓存表现得很有趣 的相关文章

随机推荐