Node实现静态服务器
1.Node里面是没有Web容器之说的,所以URL上的路径跟实际文件的路径并不是一致,这里我们手动实现一个简单的原生静态服务,让Node能够找到路径的文件,实现静态服务器功能。文件夹的任何文件都能被找到。
2.比如在index.html加一个图片时,Node的fs去找这个图片,但是WriteHead你就要写这个MIME类型,为image/jpg,虽然不写,Chrome浏览器可以显示(开发者工具可以看到这个1.jpg的Response Headers里不存在 Content-Type),有的浏览器是不能显示的,又比如CSS的文件你不写MIME类型,浏览器是识别不了了。
3.path模块获得后缀,然后写一个函数case所有情况,写进特定的MIME类型,这里也可以在函数里面再fs读一个写好的json文件,把所有类型都可以对应起来(教程上的小作业)。
//因为Node路由路径和实际文件路径并不一定一致,没有Web容器的原因,这里我们仿照Web路由的实现 var http = require("http"); var url = require("url"); var fs = require("fs"); var path = require("path"); 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) { //data是一个Buffer,二进制的数据流 if(err) { //如果文件不存在,就返回404 fs.readFile("./static/404.html", function(err, data) { res.writeHead(404,{"Content-type":"text/html;chaset=UTF8"}); res.end(data); }); return ;//必须这个,不然会走到下个data } //MIME类型,就是 //网页文件:text/html //jpg文件:image/jpg var mime = getMIME(extname) res.writeHead(200,{"Content-type":mime}); res.end(data); }) }).listen(3000,"127.0.0.1") function getMIME(extname) { switch (extname) { case ".html": return "text/html"; break; case ".jpg": return "image/jpg"; break; case ".css": return "text/css"; break; } }