2016-12-07 5 views
3

ミドルウェアによって直接nginxによって提供される静的ファイルへのリクエストをキャッシュしようとしました。エクスプレスミドルウェアでステータスコードを取得

コアコードは:

function PageCache(config) { 
    config = config || {}; 
    root = config.path || os.tmpdir() + "/_viewcache__"; 
    return function (req, res, next) { 
     var key = req.originalUrl || req.url; 
     var shouldCache = key.indexOf("search") < 0; 
     if (shouldCache) { 
      var extension = path.extname(key).substring(1); 
      if (extension) { 

      } else { 
       if (key.match(/\/$/)) { 
        key = key + "index.html" 
       } else { 
        key = key + ".html"; 
       } 
      } 

      var cacheFilePath = path.resolve(root + key) 
      try { 

       res.sendResponse = res.send; 
       res.send = function (body) { 
        res.sendResponse(body); 

        // cache file only if response status code is 200 
        cacheFile(cacheFilePath, body); 
       } 
      } 
      catch (e) { 
       console.error(e); 
      } 
     } 
     next() 
    } 
} 

は、しかし、私はコード404410500または何か他のものとresponeがキャッシュされるべきではありませんしながら、すべての応答は、どんなににステータスコードをキャッシュされていることがわかりました。

しかし、現在のリクエストのステータスコードを取得するために使用できるres.statusまたはres.get('status')のようなAPIは見つかりません。

代替ソリューションはありますか?

+0

ステータスコードは、要求に対する応答はないために次の特定され、たとえば、 '' res.status(404).send(「OK」)を使用することができますホープ – farhadamjady

答えて

5

応答が終了するたびに呼び出されるres.endイベントを上書きできます。応答が終わるといつでもstatusCodeの応答を得ることができます。

は、それはあなたが応答を送信する場合

var end = res.end; 

res.end = function(chunk, encoding) { 
    if(res.statusCode == 200){ 
     // cache file only if response status code is 200 
     cacheFile(cacheFilePath, body); 
    } 

    res.end = end; 
    res.end(chunk, encoding); 
}; 
関連する問題