node静态文本服务器设置响应头响应时添加Expires头和Cache-Control: max-age头失败
高洛峰
高洛峰 2016-11-05 13:25:57
0
1
772

我自己尝试写了一个node的静态文本服务器,可是设置响应头响应时添加Expires头和Cache-Control: max-age头老是失败。

这个是server.js

const http = require('http');
const parse = require('url').parse;
const _path = require('path');
const fs = require('fs');
let port = 4000;

const mime = require('./server/mime.js').types;
const config = require('./server/config.js');

let root = __dirname;

let server = http.createServer((req, res)=> {
    // 实现路由, 得到URL的pathname,以确定被请求文件的路径
    let url = parse(req.url).pathname;
    let path = _path.join(root, url);
    let ext = _path.extname(path);
    ext = ext ? ext.slice(1) : 'unknown';
    //响应之前判断后缀名是否符合要添加过期时间头的条件。
   if (ext.match(config.Expires.fileMatch)) {
        let expires = new Date();
        expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
        res.setHeader("Expires", expires.toUTCString());
        res.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
    }

    let contentType = mime[ext] || 'text/plain';
    fs.stat(path, (err, stats)=> {

        //注册error事件处理器,可以捕获任何可以预见或无法预见的错误
        if (err) {
            if ('ENOENT' == err.code) {
                res.statusCode = 404;
                res.end('Not Found');
            } else {
                res.statusCode = 500;
                res.end('Internet Server Error');
            }
        } else {
            res.writeHead(200, {'Content-Type': contentType});

            //用STREAM.PIPE()优化数据传输
            let stream = fs.createReadStream(path);
            stream.pipe(res);
            stream.on('error', (err)=> {
                res.statusCode = 500;
                res.end('Internet Server Error')
            })
        }
    })
});

server.listen(port, ()=> {
    console.log('server has connected :' + port);
});

这个是config.js

exports.Expires={
    fileMatch: /^(gif|png|jpg|js|css)$/ig,
    maxAge: 60 * 60 * 24 * 365
};

这个是mime.js

exports.types = {
    "css": "text/css",
    "gif": "image/gif",
    "html": "text/html",
    "ico": "image/x-icon",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "js": "text/javascript",
    "json": "application/json",
    "pdf": "application/pdf",
    "png": "image/png",
    "svg": "image/svg+xml",
    "swf": "application/x-shockwave-flash",
    "tiff": "image/tiff",
    "txt": "text/plain",
    "wav": "audio/x-wav",
    "wma": "audio/x-ms-wma",
    "wmv": "video/x-ms-wmv",
    "xml": "text/xml"
};

我重复刷新页面后Expires头和Cache-Control: max-age头没有发生变化

1.png

初学node,写静态文本服务器,希望大神能帮帮我。

不好意思,当时代码贴错了。。。


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(1)
三叔

少了代码呢,下面的代码加在//注册error事件处理器,可以捕获任何可以预见或无法预见的错误这句注释上面

const lastModified = stats.mtime.toUTCString();
const ifModifiedSince = "If-Modified-Since".toLowerCase();
res.setHeader("Last-Modified", lastModified);
if (ext.match(config.Expires.fileMatch)) {
  const expires = new Date();
  expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
  res.setHeader("Expires", expires.toUTCString());
  res.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
}
if (req.headers[ifModifiedSince] && lastModified == req.headers[ifModifiedSince]) {
    res.writeHead(304, "Not Modified");
    return res.end();
}

你的const config = require('./server/config.js');引入进来都没使用,怎么可能在头里面出现你说的信息呢!希望对你有帮助。

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan