11

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

4

2 回答 2

11

编辑:注意 express 设置视图缓存为生产启用:见express docs

视图缓存 启用视图模板编译缓存,在生产中默认启用

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

app.disable('view cache');

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

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

来自w3.org文档:

控制

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

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

于 2013-10-29T15:21:52.380 回答
2

TL;DR:试试

let articleId;

代替

var articleId;

我只是 Node.js 的另一个新手,但我刚刚通过用“var”关键字替换“let”解决了同样的问题。问题是“var”创建了一个由函数限定的变量,而“let”——一个作用域为当前块的变量。每次执行块时都会重新创建它,由于 Node.js 的异步特性,这很重要。

于 2017-01-03T00:22:47.607 回答