2017-02-23 471 views
1

我使用節點並表示iOS應用程序的後端。數據存儲在SQL Server數據庫中,所以iOS應用程序查詢服務器,服務器查詢數據庫,服務器接收數據庫響應,然後將響應轉發給iOS應用程序。我試圖找出緩存如何工作。我服務了很多靜態內容 - 例如博客文章。所以我打算使用etags,但我不確定它應該如何工作。我提出請求,獲取內容並在客戶端緩存響應。好。然後,我在之後的「If-None-Match」標題中存儲前一個響應的etag。那又怎麼樣?如何使用Express.js返回304未修改的狀態?

Express.js是否自動處理?它似乎並沒有 - 我無法讓它產生一個304響應。如果我在發送響應之前嘗試檢查響應頭,我會得到空值,所以在發送響應之前我無法獲得響應的etag。那麼我該如何將請求etag與服務器將發回的內容的etag進行比較?我是否應該使用自定義生成的etags並將其緩存在服務器上,然後將請求etags與此緩存進行比較?

下面是我設置的一個非常簡單的路線來測試這個,沒有涉及數據庫。我只是向服務器發送一個數字,然後它返回正方形。如果我發送帶有etag的請求到相同的URL,我將得到相同的響應。我可以檢查請求的'If-None-Match'標題,但是爲了確定是否應該發送304而不是200狀態,我該如何比較它?

router.use("/square/:testId", function(req, res) { 

    var obj = {}; 
    obj["testId"] = req.params.testId; 
    obj["result"] = req.params.testId * req.params.testId; 

    res.setHeader('Cache-Control', 'public, max-age=5'); 

    var h2 = JSON.stringify(res.headers,null,2); 
    console.log("The response headers: " + h2); 
    //Prints null 

    res.status(200).send(obj); 
}); 

回答

1

我應該使用自定義生成的ETag和緩存這些服務器上,然後比較請求隨着該高速緩存的ETag?

是的,你可以使用類似etag NPM模塊,可以採取緩衝或字符串,併爲您提供強大的ETag值:res.setHeader('ETag', etag(body))。如果您要在數據庫中存儲修改日期,那麼您還可以簡單地以Last-Modified標題的形式將這些修改日期發送給客戶端。在這種情況下,客戶端最終會在隨後的請求中發送If-Modified-Since,然後您可以使用該請求與請求的資源的修改列進行比較。

在任何情況下,您都將負責使用相應的狀態碼,標題和正文進行響應。

如果您正在從實際的文件系統提供靜態文件,那麼您可以只使用serve-static高速中間件,它將自動提供正確的高速緩存行爲。

0

沒有必要使用任何第三方模塊,如etag。 Express處理etag背後的邏輯,無需編寫代碼。

  1. 啓用快速etag。在下面的例子中,我們使用強大的etags。

    // Use string ETag 
    app.set('etag', 'strong'); 
    
  2. 建立在GET方法你的迴應:

    app.get('/my-data', (req, res) => { 
        ... 
        res.append('Last-Modified', (new Date(lastModifiedStringDate)).toUTCString()); 
        return res.send(response); 
    } 
    

瞧,Express將發送您的響應200 OK的任何內容或空體反應304 Not Modified

如果etag未更改,那麼提交標頭爲If-None-Match的客戶端將收到HTTP 304 Not Modified

確保您的請求不發送Cache-Control: no-cache。諸如Postman之類的工具默認發送報頭Cache-Control: no-cache,這會使Express ETag無效(畢竟沒有緩存是沒有緩存的)。您可以通過在郵差的設置中切換它來改變這種行爲。

我們在我們的回覆中加入了Last-Modified。你不需要像我們一樣使用它。但Express也將使用類似的邏輯(時間)而不是內容(Etags)來尊重If-Modified-Since:標題。