Node实现静态服务器

1.Node里面是没有Web容器之说的,所以URL上的路径跟实际文件的路径并不是一致,这里我们手动实现一个简单的原生静态服务,让Node能够找到路径的文件,实现静态服务器功能。文件夹的任何文件都能被找到。

2.比如在index.html加一个图片时,Node的fs去找这个图片,但是WriteHead你就要写这个MIME类型,为image/jpg,虽然不写,Chrome浏览器可以显示(开发者工具可以看到这个1.jpg的Response Headers里不存在 Content-Type),有的浏览器是不能显示的,又比如CSS的文件你不写MIME类型,浏览器是识别不了了。

3.path模块获得后缀,然后写一个函数case所有情况,写进特定的MIME类型,这里也可以在函数里面再fs读一个写好的json文件,把所有类型都可以对应起来(教程上的小作业)。

 

//因为Node路由路径和实际文件路径并不一定一致,没有Web容器的原因,这里我们仿照Web路由的实现
var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");

http.createServer(function(req, res) {
    //得到用户的路径
    var pathname = url.parse(req.url).pathname;
    if(pathname == "/") {
        pathname = "index.html";
    }
    //拓展名
    var extname = path.extname(pathname);
    // console.log(extname);
    //真的读取这个文件
    //缺点,太智能,但是不能检测是什么类型的文件
    fs.readFile("./static/" + pathname, function(err, data) {
        //data是一个Buffer,二进制的数据流
        if(err) {
            //如果文件不存在,就返回404
            fs.readFile("./static/404.html", function(err, data) {
                res.writeHead(404,{"Content-type":"text/html;chaset=UTF8"});
                res.end(data);
            });
            return ;//必须这个,不然会走到下个data
        }
        //MIME类型,就是
        //网页文件:text/html
        //jpg文件:image/jpg
        var  mime = getMIME(extname)
        res.writeHead(200,{"Content-type":mime});
        res.end(data);
    })
}).listen(3000,"127.0.0.1")

function getMIME(extname) {
    switch (extname) {
        case ".html":
            return "text/html";
            break;
        case ".jpg":
            return "image/jpg";
            break;
        case ".css":
            return "text/css";
            break;
        }
}

 

posted @ 2017-10-28 03:17  Lawliet__zmz  阅读(350)  评论(0编辑  收藏  举报