node.js之静态资源文件管理

var http = require("http");
var url = require("url");
var fs = require("fs");

http.createServer(function(req,res){
    //得到用户的路径
    //
    var pathname = url.parse(req.url).pathname;
    //真的读取这个文件
    fs.readFile("./static/" + pathname,function(err,data){
        if(err){
            //如果此文件不存在,就应该用404返回
            fs.readFile("./static/404.html",function(err,data){
                res.writeHead(404,{"Content-type":"text/html;charset=UTF8"});
                res.end(data);
            });
            return;
        };
        res.end(data);
    });
}).listen(3000,"127.0.0.1");

node.js之静态资源文件管理

上面代码存在两个 问题,一个小问题,一个大问题

先说小问题:没有默认的首页

大问题:fs代码无法区分你访问的是什么文件。如果这个函数访问的是一个图片,就不应该设置为网页。所以这个时候我们需要设置MIME类型,就是    网页文件  text/html   ,jpg文件 image/jpg 。就是设置一下writeHead,更改文件的拓展名。

node.js之静态资源文件管理

(在node.js中,只要你有需求,别人就有需求,有需求就会有模块,这里需要的是path模块)

node.js之静态资源文件管理

node.js之静态资源文件管理

改进代码如下:

var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");

var server = 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){
        if(err){
            //如果此文件不存在,就应该用404返回
            fs.readFile("./static/404.html",function(err,data){
                res.writeHead(404,{"Content-type":"text/html;charset=UTF8"});
                res.end(data);
            });
            return;
        };
        //MIME类型,就是
        //网页文件 : text/html
        //jpg文件 :image/jpg
        var mime = getMime(extname);
        res.writeHead(200,{"Content-type":"mime"});

        res.end(data);
    });
})

server.listen(3000, "127.0.0.1");

function getMime(extname){
    swich(extname){
        case ".html" :
            return "text/html";
            break;
        case ".jpg" :
            return "image/jpg";
            break;

        case ".css" :
            return "text/css";
            break;
    }

}

结合前几篇文章,我们其实做了一个很牛的事,static变成了根目录。相当于做了一个阿帕奇能做的事情。阿帕奇是天生有这个功能的,node.js是没有的,得自己写。我们这个改进代码其实.png图片文件也无法识别,因为没有case到。

本片文章要告诉你的是,编写一个静态服务器都很难。静态服务器就是任何文件都可以被转到。有一个文件夹提供静态了。但是你会发现你需要case一大堆。(参考标准MIME类型表)。

更加优化的一个措施,把MIME类型存储成一个文件,读取文件,需要用到JSON.parse() 。

node.js写静态服务器,需要判断路径,扩展名,然后真的去读这个文件。

千万别小看node,js,这个是PHP,JAVA等办不到的。

 

做的小demo的一个小笔记本

node.js之静态资源文件管理