Node.js学习笔记(二)——静态资源文件
实现一个小阿帕奇,自动为文件夹里面的文件、图片、css、js加上路由。
基本思想:用户输入什么url,就用fs去读取那个文件。
var http = require('http');
var url = require('url');
var fs = require('fs');
var path = require('path');
var querystring = require('querystring');
var PORT = 3000;
//mime类型映射关系对,拓展名:类型
//访问什么类型,content-type就对应是什么类型
var mime = {
'.html': 'text/html; charset = UTF-8',
'.css': 'text/css',
'.js': 'application/x-javascript',
'.jpg': "image/jpeg",
'.gif': "image/gif",
'.png': "image/png",
};
http.createServer(function(req, res){
//得到用户读取什么,比如用户输入http://127.0.0.1/a.html
//就真的去读取这个文件(路由中不带文件夹,即把这个文件作为一个root)
var pathname = url.parse(req.url).pathname;
//得到拓展名,用来判断mime类型
var extname = path.extname(pathname);
if(!extname){
//当用户输入无拓展名且不以/结尾时,此时会造成浏览器识别图片等路径层次有问题
//比如http://127.0.0.1/b 和http://127.0.0.1/b/不一样,前者认为是同级目录下的图片,后者认为是b文件夹中的。
if(pathname.substr(-1) != '/'){
res.writeHead(302, {'Location': pathname + '/'});
}
//如果url不存在拓展名,表示这是一个文件夹,则为其补充/index.html
pathname += '/index.html';
}
//真的去读取用户输入的这个文件
fs.readFile('./' + pathname, function(err, data){
if(err){
res.end('Error! ');
return;
}
//检查是否属于已知的mime类型
if(mime.hasOwnProperty(extname)){
res.setHeader('Content-Type', mime[extname]);
}
res.end(data);
})
}).listen(PORT, function(){
console.log('Server is listening on', PORT);
});
存在一个问题,304状态码not modified,当文件没有改变的时候,服务器304状态码,拒绝传输文件,上面的小程序无这样的识别,较复杂。