Node.js:if-modified-since date始终与mtime stat文件不同

时间:2016-11-11 03:32:17

标签: javascript node.js

我不知道为什么从请求标头if-modified-since解析的日期总是与在节点统计函数中从mtime解析的标签不同,即使文件未被修改也是如此。

我对修改条件的代码是这样的:

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

1 个答案:

答案 0 :(得分:0)

我找到了值始终不同的原因,结果标题last-modifiedif-modified-sinceUTC格式的日期,而文件stat.mtime的日期是ISO 8901格式的日期,这意味着解析时ISO 8901的具体时间比UTC更具体,这解释了为什么来自getTime()的最后3位数始终不同,从而产生逻辑条件总是失败。

所以为了解决这个问题,我做了一个函数来比较方法getTime()的两个日期,但由于UTC不提供这些值而忽略了最后3位数,函数如下所示:

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