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");
上面代码存在两个 问题,一个小问题,一个大问题
先说小问题:没有默认的首页
大问题:fs代码无法区分你访问的是什么文件。如果这个函数访问的是一个图片,就不应该设置为网页。所以这个时候我们需要设置MIME类型,就是 网页文件 text/html ,jpg文件 image/jpg 。就是设置一下writeHead,更改文件的拓展名。
(在node.js中,只要你有需求,别人就有需求,有需求就会有模块,这里需要的是path模块)
改进代码如下:
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的一个小笔记本