1. 程式人生 > 其它 >讀Node入門有感——>【1】構建基礎的HTTP伺服器【續】

讀Node入門有感——>【1】構建基礎的HTTP伺服器【續】

伺服器是如何處理請求的

好的,接下來我們簡單分析一下我們伺服器程式碼中剩下的部分,也就是我們的回撥函式onRequest()的主體部分。
當回撥啟動,我們的onRequest()函式被觸發的時候,有兩個引數被傳入:request和response。
它們是物件,你可以使用它們的方法來處理HTTP請求的細節,並且響應請求(比如向發出請求的瀏覽器發揮一些東西)。
所以我們的程式碼就是:當收到請求時,使用response.writeHead()函式傳送一個HTTP狀態200和HTTP頭的內容型別(content-type),使用response.write()函式在HTTP相應主體中傳送文字“Hello World”。
最後,我們呼叫response.end()完成響應。
目前來說,我們對請求的細節並不在意,所以我們沒有使用request物件。

服務端的模組放在哪裡

我們在server.js檔案中有一個非常基礎的HTTP伺服器程式碼,而且我提到通常我們會有一個叫index.js的檔案去呼叫其他模組(比如server.js中的HTTP伺服器模組)來引導和啟動應用。
我們現在就來談談怎麼把server.js變成一個真正的Node.js模組,使它可以被我們(還沒動工)的index.js主檔案使用。
也許你已經注意到,我們已經在程式碼中使用了模組了。像這樣:
var http = require("http");
...
http.createServer(...);
Node.js中自帶了一個叫做“http”的模組,我們在我們的程式碼中請求它並把返回值賦值給了一個本地變數。
這把我們的本地變數變成了一個擁有所有http模組所提供的公共方法的物件。


注意:給這種本地變數起一個和模組名稱一樣的名字是一種慣例,但是你也可以按照自己的喜好,來如下所示:

怎麼使用Node.js內部模組已經很清楚了。我們怎麼建立自己的模組,又怎麼使用它呢?
事實上,我們不用做太多的修改。把某段程式碼變成模組意味著我們需要把我們希望提供其功能的部分匯出到請求這個模組的指令碼。
目前,我們的HTTP伺服器需要匯出的功能非常簡單,因為請求伺服器模組的指令碼僅僅是需要啟動伺服器而已。
我們把我們的伺服器指令碼放到一個叫做start的函式裡,然後我們會匯出這個函式。
//server.js檔案
var http = require("http");
function start(){
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");
}
exports.start =start;
這樣我們就可以建立我們的主檔案index.js並在其中啟動我們的HTTP了,雖然伺服器的程式碼還在server.js中。
建立index.js檔案並寫入以下內容:
var server = require("./server");
server.start();
正如你所看到的,我們可以像使用任何其他的內建模組一樣使用server模組:請求這個檔案並把它指向一個變數,其中已匯出的函式就可以被我們使用了。
現在可以啟動專案了:
node index.js
我們仍然只擁有整個應用的最初部分:我們可以接收HTTP請求。但是我們得做點什麼————對於不同URL請求,伺服器應該又不同的反應。
對於一個非常簡單的應用來說,你可以直接在回撥函式onRequest()中做這件事情。不過就像我說過的,我們應該加入一些抽象的元素,讓我們的例子變得更有趣一點兒。
處理不同的 HTTP請求在我們的程式碼中是一個不同的部分,叫做“路由選擇“————那麼,我們接下來就創造一個叫做路由的模組吧。