1

刚刚将我的 Node.js 和 Express 版本分别更新为 0.10.21 和 3.4.4,现在我在开发(和生产)中看到了一些奇怪的视图缓存。

似乎从包含在其他视图(或者可能是所有视图?)中的视图生成的 html 正在被缓存。

例如:

布局.jade

doctype 5
html
    head
        title= title
        meta(name="viewport", content="width=device-width, initial-scale=1.0")
        link(rel='stylesheet', href='/stylesheets/style.css')
    body
        #container
            include header
            block content
            include footer

header.jade

- var headerClass = ""

if pageVars.headerOverBackground
    - headerClass = "overbackground"   

#header(class=headerClass)
    [snip]

somepage.jade

extends layout

block content

    [snip]

我第一次调用/ somepage 时,将pageVars.headerOverBackground设置为 true,视图会正确呈现。如果我访问具有相同布局和标题的不同 URL /someotherpage,将pageVars.headerOverBackground设置为 false ,我仍然会看到header.jade部分呈现为就好像它在上一页上一样(使用“overbackground”类在 #header 上),好像pageVars.headerOverBackground仍然为真。

但这是错误的,我有 console.log() 的证明。

难道我做错了什么?我只是非常困惑吗?我已经在开发和生产模式下运行 Node,甚至在我的 Express 中添加了

app.disable('view cache');

无济于事...

编辑:

无论我重新加载页面多少次,它都会加载缓存的视图。如果我重新启动节点并重新加载,则会出现正确的视图。

4

1 回答 1

2

好的,我想我可能已经解决了这个问题。

其中一条路线错误地有

pageVars = {};

代替

var pageVars = {}; 

导致声明一个全局变量。哎呀!在旧版本的 Node/Express/Jade 和当前版本之间的某个地方,Jade 开始更喜欢全局变量,即使显式传递了同名的本地变量也是如此。

所以如果一条路线错误地

pageVars = {};  //global, oops
pageVars.headerOverBackground = true;
res.render("onepage", {pageVars:pageVars}); 

然后调用另一条路线

var pageVars = {};  //local
// pageVars.headerOverBackground is undefined
res.render("anotherpage", {pageVars:pageVars});

anotherpage视图中的jade会使用pageVars的全局版本,而不是传入的局部变量,仍然会认为pageVars.headerOverBackground为true。

于 2013-10-31T12:54:48.243 回答