缓存流程:
1.第一次S->C:"Last-Modified::xxxx"
2.第二次C->S:"If-Modified-Since:xxxx"
3.第二次S->C: 200 || 304
注意测试前先把浏览器f12工具设置里的Disable cache关掉
不带缓存机制
const http = require('http')
const fs = require('fs')
const url = require('url')
http.createServer((req,res)=>{
let {pathname} = url.parse(req.url)
//获取文件日期
fs.stat(`www${pathname}`,(err,stat)=>{
if(err){
res.writeHeader(404)
res.write('Not Found')
res.end()
}else{
let rs = fs.createReadStream(`www${pathname}`)
//stat.mtime可以获取到文件的最后修改时间,是个Date对象
//toUTCString()用于将Date对象转化为标准GMT时间
res.setHeader('Last-Modified',stat.mtime.toUTCString())
//输出
rs.pipe(res)
rs.on('error',err=>{
res.writeHeader(404)
res.write('Not Found')
res.end()
})
}
})
}).listen(5000)
第一次请求:在响应头里出现了Last-Modified
第二次请求:在请求头里出现了If-Modified-Since
带缓存机制
const http = require('http')
const fs = require('fs')
const url = require('url')
http.createServer((req,res)=>{
let {pathname} = url.parse(req.url)
//获取文件日期
fs.stat(`www${pathname}`,(err,stat)=>{
if(err){
res.writeHeader(404)
res.write('Not Found')
res.end()
}else{
if(req.headers['if-modified-since']){
let client_date = Math.floor(new Date(req.headers['if-modified-since']).getTime() / 1000);
let server_date = Math.floor(stat.mtime.getTime() / 1000);//以秒为单位
if(client_date < server_date){//服务器文件的时间靠后
sendFileToClient()
}else{
res.writeHeader(304)
res.write('Not Modified')
res.end()
}
}else{
sendFileToClient()
}
function sendFileToClient(){//封装响应函数
let rs = fs.createReadStream(`www${pathname}`)
//stat.mtime可以获取到文件的最后修改时间,是个Date对象
//toUTCString()用于将Date对象转化为标准GMT时间
res.setHeader('Last-Modified',stat.mtime.toUTCString())
//输出
rs.pipe(res)
rs.on('error',err=>{
res.writeHeader(404)
res.write('Not Found')
res.end()
})
}
}
})
}).listen(5000)
两次请求后:
修改一下请求的html文件,然后重新请求,文件大小为615B:
刷新浏览器,第二次请求,文件大小90B:
缓存可以节约带宽流量