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