美文网首页前端学习饥人谷技术博客程序员
用nodejs做一个简易的静态资源服务器

用nodejs做一个简易的静态资源服务器

作者: 忽如寄 | 来源:发表于2016-09-04 11:59 被阅读745次

    首先我们知道最简单的http服务器如下:

    var http=require("http");
    http.createServer(function(req,res){
    res.writeHead(200,{"content-type":"text/plain"});
    res.write("hello world!");
    res.end();
    }).listen(8000)
    

    很明显,我们需要的是可以为用户展示我们静态资源的服务器,而不是仅仅传给用户几个字符串就行,如果是这样,那互联网还发展个毛呀,既然是要发送文件,显然我们需要用到fs模块,利用fs模块将所有的数据读出来后展示给用户:

    var http=require("http");
    var fs=require("fs");
    http.createServer(function(req,res){
    fs.readFile("./index.html",function(err,data){
    res.writeHead(200,{"content-type":"text/html"});
    res.write(data);
    res.end();
    });
    }).listen(8000)
    

    这个时候我们就可以看到页面开始显示index文件了,终于可以显示静态资源了,但是,聪明的你肯定发现了,这样用户只能访问这一个页面,这对用户来说简直了,因此我们要增加路由,简单的路由实现如下:

    var http=require("http");
    var url=require("url");
    
    var server=http.createServer(function(req,res){
        var pathname=url.parse(req.url).pathname;
        res.writeHead(200,{"content-type":"text/plain"});
        res.write("yourpath: "+pathname);
        res.end();
    });
    server.listen(8000);
    

    这是我们就可以看到访问页面的会有提示你所在路径的消息了,这是最简单的路由了,按着这个道理,我们只要通过检测pathname,进而根据不同的pathname执行不同的函数,我们的路由效果就实现了。
    当然我相信你已经发现了content-type我在上面针对html文件和普通字符串设置的值是不同的,这是关于http的知识了,我们现在只要知道如果我们设置的content-type是错误的,我们是不会得到我们想要的效果的,比如我们如果把html文件的content-type设置为"text/plain",那么返回的就是整个HTML代码了,对于不同的文件设置不同的值是必须的,不废话了,我直接上图:


    因此我们需要针对不同类型的文件设置不同的content-type,我们新建一个文件mime.js,导出部分类型:

    exports.types={
        ".html":"text/html",
        ".css":"text/css",
        ".js":"text/javascript",
        ".gif": "image/gif",
        ".ico": "image/x-icon",
        ".jpeg": "image/jpeg",
        ".jpg": "image/jpeg",
        ".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"
    }
    

    我们需要获取每次用户请求文件的后缀名,显然这时候需要用到path模块的extname方法,另外我们也每次检测用户请求的文件存不存在,不存在就返回404:

    var http=require("http");
    var url=require("url");
    var fs=require("fs");
    var path=require("path");
    var mime=require("./mime").types;
    
    
    var server=http.createServer(function(req,res){
        var pathname=url.parse(req.url).pathname;
        fs.exists(pathname, function(exists){
            if(!exists){
                res.writeHead("404",{"content-type":"text/plain"});
                res.write("404,not found!");
                res.end();
            }else{
                fs.readFile(pathname,function(err,data){
                    if(err){
                        res.writeHead(500,{"content-type":"text/plain"});
                        res.end(err);
                    }else{
                        var ext=path.extname(pathname);
                        var contenttype=mime[ext]||"text/plain";
                        res.writeHead(200,{"content-type":contenttype});
                        res.write(data);
                        res.end();
                    }
                });
            }
        });
    });
    server.listen(8000);
    

    这时候一个简单的静态资源服务器就搭建好,但是我们肯定不想把我们后端的代码暴露给用户,因此,我们可以建一个文件夹专门存放静态资源,同时每次给pathname加上这个文件夹名就行了:

    var http=require("http");
    var url=require("url");
    var fs=require("fs");
    var path=require("path");
    var mime=require("./mime").types;
    
    var server=http.createServer(function(req,res){
        var pathname=url.parse(req.url).pathname;
        var realpath="static"+pathname;
        fs.exists(realpath, function(exists){
            if(!exists){
                res.writeHead("404",{"content-type":"text/plain"});
                res.write("404,not found!");
                res.end();
            }else{
                fs.readFile(realpath,function(err,data){
                    if(err){
                        res.writeHead(500,{"content-type":"text/plain"});
                        res.end(err);
                    }else{
                        var ext=path.extname(realpath);
                        
                        var contenttype=mime[ext]||"text/plain";
                        res.writeHead(200,{"content-type":contenttype});
                        res.write(data);
                        res.end();
    
                    }
                });
            }
        });
    });
    server.listen(8000);
    

    好的,这样我们只需要把我们的静态文件放在static文件夹下就行了,当然此时这个静态资源服务器当然够我们自己用,这是毋庸置疑的,但是当然还不能作为发布给用户的服务器,毕竟里面涉及到的安全,缓存等问题这里并不能处理,但是测试自己的静态资源还是足够用的。

    相关文章

      网友评论

        本文标题:用nodejs做一个简易的静态资源服务器

        本文链接:https://www.haomeiwen.com/subject/vaelettx.html