2016-11-11 5 views
0

リクエストヘッダーで解析された日付がif-modified-sinceの場合、ファイルが変更されていない場合でもnode 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バージョンとは何かを持っていない?現在、私はv6.9.1を使用していますUbuntu 16.04 x64 Desktop

答えて

0

値が常に異なっていた理由がわかりました。ファイルstat.mtimeから日付がISO 8901形式の日付である一方、RS last-modifiedif-modified-sinceは、これが解析されたときにISO 8901はロジックを作り、getTime()からの最後の3桁は常に異なっている理由を説明UTCより具体的な時間を持っていることを意味し、UTC形式の日付です常に失敗する状態。

だから、この問題を解決するために、私はこの方法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

関連する問題