node缓存

缓存流程:
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:

缓存可以节约带宽流量

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。