2012-06-05 105 views
1

已經使用了一段時間,但這是我的第一個問題,因爲我找不到解決這個特定問題的方法。我會盡量做到儘可能明確,有什麼不清楚的只是讓我知道,所以我相應地更新了這個問題。節點/快速服務圖像是否存在;緩存問題

我正在使用路由來根據在路由中傳遞的userId作爲參數()來提供用戶的照片。它可以工作,但每次遇到標籤時,都會從服務器請求圖像,並且從不使用緩存版本。

我玩過緩存控制了一下,但沒有全部或沒有:如果啓用了緩存並且用戶更改了他的照片,它仍然會使用舊照片。

我的問題是:如果照片沒有改變,是否有可能使用緩存版本,但是如果它確實使用服務器上的那個版本?我嘗試使用「必須重新驗證」以及「max-age」或「no-cache」無濟於事。

,路線如下代碼,如果有幫助:

Module.exports.getPhoto = function(req, res) { 
    var mime = require('mime-magic'), 
     memberId = req.params.memberId, 
     imgUrl; 

    path.exists('public/images/memberPhotos/' + memberId, function(exists) { 
     if(exists) { 
      imgUrl = 'public/images/memberPhotos/' + memberId; 
     }else{ 
      imgUrl = 'public/images/memberPhotos/noPhoto.jpg'; 
     } 

     fs.readFile(imgUrl, function(err, img) { 
      mime.fileWrapper(imgUrl, function(err, mimeType) { 
       if(!err) { 
        console.log(mimeType); 
        res.writeHead(200, { 
         'Content-Type': mimeType, 
         'Cache-Control': "max-age=" + 43800*60 + ", must-revalidate" 
        }); 
        res.end(img, 'binary'); 
       } 
      }); 

     }); 
    }); 
}; 

感謝

回答

1

您希望使用ETagIf-None-Match頭。您將需要跟蹤服務器上的圖像ETags,並且如果傳入的If-None-Match與當前的ETag匹配,則您使用304 - 未修改來響應該請求。否則,您將提供圖像並在標題中包含新的ETag。

查看http://blog.phyber.com/supporting-cache-controls-in-nodejs瞭解更多詳情。

+0

對不起,延遲 - 謝謝你的回答。 我會盡快測試,但這看起來確實是我要找的。接受答案! –

+0

鏈接斷開,無效。 –