2013-06-04 86 views
11

我遇到了一些有趣的東西與視圖緩存在快遞/翡翠。控制器通過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混淆?

+2

使用「相同的編譯模板」,你的意思是相同的*渲染*模板?我不確定它是否是視圖緩存,因爲在開發模式下運行時它不是主動的(除非你明確地啓用了它)?此外,視圖緩存僅存儲已編譯(但未呈現)的模板,它們仍將針對每個請求單獨呈現。你的應用安裝程序是什麼樣的?任何其他中間件(或者可能是Node前的代理服務器)都可能導致此問題? – robertklep

+1

我同意@robertklep。我猜它是你的緩存代理。如果你看到任何緩存頭,你能檢查響應頭嗎?另外,請嘗試在服務器端設置以下標題。 緩存控制:無緩存,無店鋪,必重新驗證 雜注:無緩存過期 :0 看看是否能爲你的作品HTTP://stackoverflow.com/questions/49547/making-確保Web頁面不被緩存 - 跨瀏覽器 –

回答

7

編輯: 注意表達套查看生產允許緩存: 看到express docs

視圖緩存啓用視圖模板編譯緩存,默認情況下在 生產允許

嘗試加入這一行在您的應用配置部分:

app.disable('view cache'); 

另外,嘗試添加高速緩存控制標頭

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

w3.org文檔:

Cahce-控制

緩存控制通用頭字段用於指定指令 必須遵循 請求/響應鏈上的所有緩存機制。該指令指定旨在防止緩存不利於請求或 響應的行爲。這些指令通常會覆蓋默認緩存算法。 Cache指令是單向的,因爲請求中指令的存在 並不意味着要在響應中給出相同的指令 。

如果你需要一個更先進的控制,考慮其他領域,如最大年齡,this question也是一個很好的資源,你會看到不同的瀏覽器可以實現這個RFC略有不同。

+0

瀏覽器緩存不是問題。說我看看四個不同的博客文章。稍後,所有網址將開始提供相同的博客文章。這就像玉緩存模板,並不打擾使用我傳遞給它的對象......它只是使用最後已知的值。 – MikeSmithDev

+0

好吧,我明白了你的觀點,標題不僅僅針對瀏覽器緩存,想象你在製作一個Varnish,或者你的DNS有一個像Cloudflare一樣的緩存機制,響應中的這個頭必須遵守這個鏈。但我明白你的觀點。 然後,我會替換玉或hbs或其他放棄這是一個模板引擎問題。或者看看Jade回購看看是否存在已知的緩存問題。 – alfonsodev

+0

是的,我想我必須走這條路。 – MikeSmithDev

2

TL; DR:儘量

let articleId; 

代替

var articleId; 

我只是一個newbro到Node.js的,但我剛下代以 「無功」 解決了同樣的問題「let」的關鍵字。事情是「var」創建一個函數作用域的變量,而「let」 - 作用域爲當前塊。每次執行塊時都會重新創建,由於Node.js的異步特性,這非常重要。