我不知道为什么从请求标头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
答案 0 :(得分:0)
我找到了值始终不同的原因,结果标题last-modified
和if-modified-since
是UTC
格式的日期,而文件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