1

Node.js と Express のバージョンをそれぞれ 0.10.21 と 3.4.4 に更新したところ、開発中 (および運用中) に奇妙なビュー キャッシュが見られるようになりました。

他のビュー (またはすべてのビュー?) に含まれるビューから生成された html がキャッシュされているようです。

例えば:

レイアウト.ジェイド

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」クラスを使用) にあるかのようにレンダリングされます。pageVars.headerOverBackgroundがまだ true であるかのように。

しかし、それは誤りであり、それを証明するために console.log() を持っています。

私は何か間違ったことをしていますか?私はひどく混乱していますか?Nodeを開発モードと本番モードで実行し、Expressに

app.disable('view cache');

無駄に...

編集:

ページを何度リロードしても、キャッシュされたビューが読み込まれます。ノードを再起動してリロードすると、正しいビューが表示されます。

4

1 に答える 1

2

さて、私はこれを解決したかもしれないと思います。

ルートの 1 つに誤って

pageVars = {};

それ以外の

var pageVars = {}; 

その結果、グローバル変数が宣言されます。おっとっと!そして、Node/Express/Jade の古いバージョンと現在のバージョンの間のどこかで、Jade は、同じ名前のローカル変数を明示的に渡した場合でも、グローバル変数を優先し始めました。

したがって、1 つのルートが誤って

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 に答える