前端学习饥人谷技术博客程序员

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

2016-09-04  本文已影响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文件夹下就行了,当然此时这个静态资源服务器当然够我们自己用,这是毋庸置疑的,但是当然还不能作为发布给用户的服务器,毕竟里面涉及到的安全,缓存等问题这里并不能处理,但是测试自己的静态资源还是足够用的。

上一篇 下一篇

猜你喜欢

热点阅读