2013年11月12日 星期二

【Node.js】Create Http Server

自己以前寫網站習慣,前端使用JavaScript(or jQuery),後端使用PHP,使用Apache建立Server。

而Node.js則打破此框架,簡單講就是,伺服器端的JavaScript! 

為了實現此概念,Node.js借助Google V8引擎在後端運行JavaScript。

想從建立一個基礎Http Server入門,範例code包含三個觀念,使用模組、函數傳遞以及回呼(callback)。
var http = require("http");

function onRequest(request, response) {
  console.log("Request received.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);

console.log("Server has started.");
第一行code很簡單,呼叫Node.js內建http模組並存入http變數。

接下來寫一個onRequest函數處理http的請求,這邊我們可以看到http使用createServer方法時,onRequest這個函數被當成是參數來傳遞,此即所謂的函數傳遞。

而Server監聽8888 port同時等待HTTP的請求,當有請求發生時,執行onRequest函式,此即所謂callback。
callback:給甲方法傳遞乙函式,等到對應事件發生時,才執行乙函式。
以上述code來看的話→
甲方法 ─ createServer
乙函式 ─ onRequest
對應事件 ─ HTTP的請求
補充一下,乙函式也很常使用匿名函式。

最後一行code會在命令行上輸出"Server has started.",幫助我們測試程式流程與了解事件的觸發順序,此程式流程為非同步流程,因為http.createServer後,程式會繼續執行,等到有http請求才去執行onRequest函式。

當我們執行腳本後

當我們在瀏覽器輸入localhost:8888後

最後回到命令行會看到
當我們使用瀏覽器讀取網頁時,我們的伺服器有可能會輸出兩次"Request received."。原因為何?我們可以修改code增加解析路徑的功能。

修改code如下
var http = require("http"),
    url = require("url");

function start() {
    function onRequest(request, response) {
        var pathname = url.parse(request.url).pathname;
        console.log("Request for " + pathname + " received.");
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Hello Node.js");
        response.end();
    }
    
    http.createServer(onRequest).listen(8888);
    console.log("Server has started.");
}

exports.start = start;

使用Node.js內建url模組,並呼叫其parse方法幫我們解析request.url,
即分析HTTP的請求路徑為何。

腳本編譯完成後,我們一樣開啟browser輸入localhost:8888
然後回到命令列的地方觀看log訊息

觀看log訊息可以知道請求路徑。由此得知,當我們在存取http://localhost:8888的當下, 伺服器也嘗試存取 http://localhost:8888/favicon.ico 。 因此我們上一段code,log訊息才會出現兩次"Request received."。

沒有留言:

張貼留言