2016-11-11 46 views
0

我不知道爲什麼從請求標頭if-modified-since解析的日期總是不同於從節點stat函數中的mtime解析的pate,即使文件未被修改。Node.js:if-modified-since日期總是不同於mtime stat文件

的代碼我有修改的條件是這樣的:

fs.stat(file.dir, function(err, stats){ 
    if(err){ 
     $.status("500"); 
     $.end(); 

     console.error(err); 
    } 

    else{ 
     /* 
     * Check if file was modified, send 304 if not 
     */ 
     if(!$.header("if-modified-since")){ 
      $.header("Last-Modified", new Date(stats.mtime).toUTCString()); 
      sendFile(file, $); 
     } 

     else{ 
      var lastModified = new Date($.header("if-modified-since")); 
      var modified = new Date(stats.mtime); 

      console.log($.url.pathname, lastModified.getTime(), modified.getTime()); 

      if(modified.getTime() == lastModified.getTime()){ 
       $.status("304"); 
       $.end(); 
      } 

      else{ 
       $.header("Last-Modified", new Date(stats.mtime).toUTCString()); 
       sendFile(file, $); 
      } 
     } 
    } 
}); 

日誌中的代碼有這樣的結果:

// On non-modified file request 
/style.css 1478834712000 1478834712057 

// On modified file request 
/style.css 1478834712000 1478834851656 

// On non-modified file request after modified file request 
/style.css 1478834851000 1478834851656 

,這都什麼跟node.js版本?目前我對Ubuntu 16.04 x64 Desktop

回答

0

我發現爲什麼值總是不同的原因使用v6.9.1,原來,heade RS last-modifiedif-modified-sinceUTC格式的日期,而從文件stat.mtime日期是ISO 8901格式的日期,這意味着解析時ISO 8901UTC更具體的時間,這也解釋了爲什麼從getTime()最後3位總是不同的,使得邏輯條件總是失敗。

因此,要解決這個問題,我做了一個功能,這兩個日期從方法getTime()比較,但由於最後3位被忽略到UTC不提供這些值,函數如下:

var isEqualTime = function(time1, time2){ 
    var time1 = new Date(time1) 
     .getTime() 
     .toString() 
     .slice(0, -3); 

    var time2 = new Date(time2) 
     .getTime() 
     .toString() 
     .slice(0, -3); 

    return time1 == time2; 
} 

因此在需要該結果的代碼現在修改是這樣的:

var lastModified = $.header("if-modified-since"); 
var modified = file.stats.mtime; 

// send file if "if-modified-since" header is undefined 
// if defined then compare if file is modified 
if(!lastModified || !helper.isEqualTime(lastModified, modified)){ 
    sendFile($, file); 
} 

// send 304 if file was not modified 
else{ 
    $.status("304"); 
    $.end(); 
} 

file可變對象現在包含在功能sendFile()發送報頭中的文件的統計last-modified