Nodejs实现的一个静态服务器实例

前端技术 2023/09/05 JavaScript

参考cnodejs.org上面的静态服务器例子,写了下面的一个nodejs静态服务器例子,里面包含cache,压缩,贴代码如下:

复制代码 代码如下:

/**
 * 静态文件服务器测试例子
 * User: xuwm
 * Date: 13-5-17
 * Time: 上午8:38
 * To change this template use File | Settings | File Templates.
 */
var port=3333;
var http = require(\"http\");
var url = require(\"url\");
var fs = require(\"fs\");
var path = require(\"path\");
var mime = require(\"./mime\").types;
var config = require(\"./config\");
var zlib = require(\"zlib\");
//创建http服务端
var server=http.createServer(function(request,response){
    var obj= url.parse(request.url);
    response.setHeader(\"Server\",\"Node/V8\");
    console.log(obj);
    var pathname=obj.pathname;
    if(pathname.slice(-1)===\"/\"){
        pathname=pathname+config.Welcome.file;   //默认取当前默认下的index.html
    }
    var realPath = path.join(\"assets\", path.normalize(pathname.replace(/\\.\\./g, \"\")));
    console.log(realPath) ;
    var pathHandle=function(realPath){
    //用fs.stat方法获取文件
        fs.stat(realPath,function(err,stats){
            if(err){
                response.writeHead(404,\"not found\",{\'Content-Type\':\'text/plain\'});
                response.write(\"the request \"+realPath+\" is not found\");
                response.end();
            }else{
                if(stats.isDirectory()){
                }else{
                    var ext = path.extname(realPath);
                    ext = ext ? ext.slice(1) : \'unknown\';
                    var contentType = mime[ext] || \"text/plain\";
                    response.setHeader(\"Content-Type\", contentType);

                    var lastModified = stats.mtime.toUTCString();
                    var ifModifiedSince = \"If-Modified-Since\".toLowerCase();
                    response.setHeader(\"Last-Modified\", lastModified);

                    if (ext.match(config.Expires.fileMatch)) {
                        var expires = new Date();
                        expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
                        response.setHeader(\"Expires\", expires.toUTCString());
                        response.setHeader(\"Cache-Control\", \"max-age=\" + config.Expires.maxAge);
                    }

                    if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) {
                        console.log(\"从浏览器cache里取\")
                        response.writeHead(304, \"Not Modified\");
                        response.end();
                    } else {
                        var raw = fs.createReadStream(realPath);
                        var acceptEncoding = request.headers[\'accept-encoding\'] || \"\";
                        var matched = ext.match(config.Compress.match);

                        if (matched && acceptEncoding.match(/\\bgzip\\b/)) {
                            response.writeHead(200, \"Ok\", {\'Content-Encoding\': \'gzip\'});
                            raw.pipe(zlib.createGzip()).pipe(response);
                        } else if (matched && acceptEncoding.match(/\\bdeflate\\b/)) {
                            response.writeHead(200, \"Ok\", {\'Content-Encoding\': \'deflate\'});
                            raw.pipe(zlib.createDeflate()).pipe(response);
                        } else {
                            response.writeHead(200, \"Ok\");
                            raw.pipe(response);
                        }
                    }
                }
            }
        });

    }
    pathHandle(realPath);
});
server.listen(port);
console.log(\"http server run in port:\"+port);

本文地址:https://www.stayed.cn/item/12133

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。