1. 程式人生 > 實用技巧 >前端入職學習筆記-第一週第四天

前端入職學習筆記-第一週第四天

學習路徑

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() 函式被觸發的時候,有兩個引數被傳入: requestresponse

它們是物件,你可以使用它們的方法來處理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模組,它們分別是urlquerystring模組。

                               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