前端入職學習筆記-第一週第四天
學習路徑
Node.js·
1、Node.js入門
1.1 構建基礎的HTTP伺服器
讓我們先從伺服器模組開始。在你的專案的根目錄下建立一個叫server.js的檔案,並寫入以下程式碼:
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
搞定!你剛剛完成了一個可以工作的HTTP伺服器。為了證明這一點,我們來執行並且測試這段程式碼。首先,用Node.js執行你的指令碼:
node server.js
接下來,開啟瀏覽器訪問http://localhost:8888/,你會看到一個寫著“Hello World”的網頁。
1)第一行請求(require)Node.js自帶的 http 模組,並且把它賦值給 http 變數。
2)接下來我們呼叫http模組提供的函式: createServer 。這個函式會返回一個物件,這個物件有一個叫做 listen 的方法,這個方法有一個數值引數,指定這個HTTP伺服器監聽的埠號。
我們本來可以用這樣的程式碼來啟動伺服器並偵聽8888埠:
var http = require("http");
var server = http.createServer();
server.listen(8888);
這段程式碼只會啟動一個偵聽8888埠的伺服器,它不做任何別的事情,甚至連請求都不會應答。
1.2 基於事件驅動的回撥
當我們使用 http.createServer 方法的時候,我們當然不只是想要一個偵聽某個埠的伺服器,我們還想要它在伺服器收到一個HTTP請求的時候做點什麼。
問題是,這是非同步的:請求任何時候都可能到達,但是我們的伺服器卻跑在一個單程序中。
寫PHP應用的時候,我們一點也不為此擔心:任何時候當有請求進入的時候,網頁伺服器(通常是Apache)就為這一請求新建一個程序,並且開始從頭到尾執行相應的PHP指令碼。
我們利用node.js建立了伺服器,並且向建立它的方法傳遞了一個函式。無論何時我們的伺服器收到一個請求,這個函式就會被呼叫。這個就是傳說中的 回撥
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.");
注意:在 onRequest (我們的回撥函式)觸發的地方,我用 console.log 輸出了一段文字。在HTTP伺服器開始工作之後,也輸出一段文字。
接下來我們簡單分析一下我們伺服器程式碼中剩下的部分,也就是我們的回撥函式 onRequest() 的主體部分。
當回撥啟動,我們的 onRequest() 函式被觸發的時候,有兩個引數被傳入: request 和 response 。
它們是物件,你可以使用它們的方法來處理HTTP請求的細節,並且響應請求(比如向發出請求的瀏覽器發回一些東西)。
所以我們的程式碼就是:當收到請求時,使用 response.writeHead() 函式傳送一個HTTP狀態200和HTTP頭的內容型別(content-type),使用 response.write() 函式在HTTP相應主體中傳送文字“Hello World"。
最後,我們呼叫 response.end() 完成響應。
1.3 程式碼模組化
目前,我們的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
1.4 處理請求
我們需要的所有資料都會包含在request物件中,該物件作為onRequest()回撥函式的第一個引數傳遞。但是為了解析這些資料,我們需要額外的Node.JS模組,它們分別是url和querystring模組。
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring(string)["foo"] | | querystring(string)["hello"]
當然我們也可以用querystring模組來解析POST請求體中的引數,稍後會有演示。
現在我們來給onRequest()函式加上一些邏輯,用來找出瀏覽器請求的URL路徑:
var http = require("http");
var 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 World");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start = start;
現在我們可以來編寫路由了,建立一個名為router.js的檔案,新增以下內容:
function route(pathname) {
console.log("About to route a request for " + pathname);
}
exports.route = route;
首先,我們來擴充套件一下伺服器的start()函式,以便將路由函式作為引數傳遞過去:
var http = require("http");
var url = require("url");
function start(route) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
route(pathname);
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,使得路由函式可以被注入到伺服器中:
var server = require("./server");
var router = require("./router");
server.start(router.route);
現在啟動應用(node index.js,始終記得這個命令列)
bash$ node index.js Request for /foo received. About to route a request for /foo