使用node搭建小型服務器(其實就是分析url然后輸出文件給客戶端)
最近需要完成一個課程設計,被項目經理(組長)分配寫界面,但是總覺得只寫前端的話缺了點什么,所以想自己寫下后端玩一下。
期間還稍微糾結了一下用什么語言,本來打算正好學習一下PHP,可后來轉念一想,用nodejs豈不美哉,不僅了解了后臺開發,也相當于鞏固了js基礎,一舉兩得,美滋滋。
在學習node的過程中,學到了使用node實現一個服務器這一塊,感覺是對前面所學模塊的一個很好的總結。用到了四個基本的模塊fs stream http path
代碼如下:(內含蹩腳英文注釋請見諒)
'use strict' var url = require('url'); var path = require('path'); var fs = require('fs'); var http = require('http'); //get the current path //var root = path.resolve('.');//以當前的目錄為服務器的根目錄 var root = path.resolve(process.argv[2] || '.');//以輸入的參數作為服務器的根目錄,如果沒有輸入參數就將當前目錄作為服務器根目錄 console.log('local root dir :' + root); //create server var server = http.createServer(function(request, response) { //get the path of URL var pathname = url.parse(request.url).pathname; //get the local path var filepath = path.join(root, pathname); //get the file stat and output the request file by callback function fs.stat(filepath, function(err, stat) { if(!err && stat.isFile()) { console.log('200' + request.url); response.writeHead(200); fs.createReadStream(filepath).pipe(response);//沒有必要手動讀取文件內容。由于response對象本身是一個Writable Stream,直接用pipe()方法就實現了自動讀取文件內容并輸出到HTTP響應。 } else { console.log('404' + request.url); response.writeHead(404); response.end('404 Not Found'); } }); }); server.listen(8080); console.log('Server is running at :8080/');
對于其中一些函數的解釋:
path.resolve() 路徑尋航(這名字不錯) path.resolve([from…], to)
有個解釋很有趣:相當于不斷地調用系統的cd指令
eg:
path.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile') //相當于: cd foo/bar cd /tmp/file/ cd .. cd a/../subfile1 path.join([path1],path[2]...) 路徑合并
將所有名稱用path.seq串聯起來,然后用normailze格式化
eg:
path.join('///foo', 'bar', '//baz/asdf', 'quux', '..'); =>'/foo/bar/baz/asdf'
既然提到了normalize
那么:
格式化路徑 path.normalize(p)
將不符合規范的路徑格式化,簡化開發人員中處理各種復雜的路徑判斷
eg:
path.normalize('/foo/bar//baz/asdf/quux/..'); => '/foo/bar/baz/asdf'
http.response.end()結束相應,告訴客戶端所有消息已經發送。當所有要返回的內容發送完畢時,該函數必須要被調用一次。如果不調用該函數,那么客戶端將會永遠處于等待狀態。
使用方法:
response.end([data], [encoding])
data end()執行完畢后要輸出的字符,如果指定了 data 的值,那就意味著在執行完 response.end() 之后,會接著執行一條 response.write(data , encoding);
encoding 對應data的字符編碼