Node.js學習筆記(二)——靜態資原始檔
阿新 • • 發佈:2018-12-19
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狀態碼,拒絕傳輸檔案,上面的小程式無這樣的識別,較複雜。