node.js之伺服器如何處理請求
伺服器是如何處理請求的
當回撥啟動,我們的 onRequest() 函式被觸發的時候,有兩個引數被傳入:request 和 response 。
它們是物件,你可以使用它們的方法來處理HTTP請求的細節,並且響應請求(比如向發出請求的瀏覽器發回一些東西)。
所以我們的程式碼就是:當收到請求時,使用 response.writeHead() 函式傳送一個HTTP狀態200和HTTP頭的內容型別(content-type),使用 response.write() 函式在HTTP相應主體中傳送文字“Hello World"。
最後,我們呼叫 response.end() 完成響應。
目前來說,我們對請求的細節並不在意,所以我們沒有使用 request
服務端的模組放在哪裡
OK,就像我保證過的那樣,我們現在可以回到我們如何組織應用這個問題上了。我們現在在 server.js 檔案中有一個非常基礎的HTTP伺服器程式碼,而且我提到通常我們會有一個叫 index.js 的檔案去呼叫應用的其他模組(比如 server.js 中的HTTP伺服器模組)來引導和啟動應用。
我們現在就來談談怎麼把server.js變成一個真正的Node.js模組,使它可以被我們(還沒動工)的 index.js 主檔案使用。
也許你已經注意到,我們已經在程式碼中使用了模組了。像這樣:
var http = require("http");... http.createServer(...);
Node.js中自帶了一個叫做“http”的模組,我們在我們的程式碼中請求它並把返回值賦給一個本地變數。
這把我們的本地變數變成了一個擁有所有 http 模組所提供的公共方法的物件。
給這種本地變數起一個和模組名稱一樣的名字是一種慣例,但是你也可以按照自己的喜好來:
var foo = require("http");... foo.createServer(...);
很好,怎麼使用Node.js內部模組已經很清楚了。我們怎麼建立自己的模組,又怎麼使用它呢?
等我們把 server.js 變成一個真正的模組,你就能搞明白了。
事實上,我們不用做太多的修改。把某段程式碼變成模組意味著我們需要把我們希望提供其功能的部分 匯出
目前,我們的HTTP伺服器需要匯出的功能非常簡單,因為請求伺服器模組的指令碼僅僅是需要啟動伺服器而已。
我們把我們的伺服器指令碼放到一個叫做 start 的函式裡,然後我們會匯出這個函式。
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請求在我們的程式碼中是一個不同的部分,叫做“路由選擇”——那麼,我們接下來就創造一個叫做 路由 的模組吧。