1. 程式人生 > >Node.js學習筆記(二)——靜態資原始檔

Node.js學習筆記(二)——靜態資原始檔

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狀態碼,拒絕傳輸檔案,上面的小程式無這樣的識別,較複雜。