Node.js中HTTP模組與事件模組詳解,node.js詳解
Node.js的http伺服器
通過使用HTTP模組的低級API,Node.js允許我們建立伺服器和用戶端。剛開始學node的時候,我們都會遇到如下代碼:
複製代碼 代碼如下:
var http = require('http');
http.createServer(function (req,res) {
res.end('Hello World\n');
}).listen(3000,"127.0.0.1");
console.log("Server funning at http://127.0.0.1:3000");
這段代碼的包括了http模組的資訊,意思是:
1.從`Node.js`的核心請求HTTP模組並賦予一個變數,以便在以後的指令碼中使用。
於是指令碼就可以訪問一些方法來通過`Node.js`使用`HTTP`。
2.使用`createServer`建立新的web伺服器對象
3.指令碼將一個匿名函數傳遞給伺服器,告訴web伺服器對象每當其接收到請求時會發生的是什麼
4.指令碼第4行定義了web伺服器的連接埠和主機,這意味著可以使用`http://127.0.0.1:3000`
來訪問伺服器
Http頭
對於每個HTTP請求和響應,都會發送HTTP頭,HTTP頭髮送的是附加的資訊,包括內容類型、伺服器發送響應的日期以及HTTP狀態代碼
http頭包含了許多資訊,以下是我的百度首頁包含的http頭的資訊:
由於我的百度首頁添加了較多的網站,所以這裡的資料和讀者們的可能不一樣。從中我們可以看出百度是web伺服器是BWS/1.1
下面是剛才上面那段代碼的http頭部資訊:
Node.js中的重新導向
在node中,我們可以很容易地建立一個簡單的伺服器將訪問者重新導向到另外一個Web頁面上,其準則如下:
1.給客戶發送301響應代碼,告訴客戶,資源已經移到另一個位置了;
2.發送一個位置頭告訴客戶重新導向到哪裡。
相關代碼如下:
複製代碼 代碼如下:
var http = require('http');
http.createServer(function (req,res) {
res.writeHead(301,{
'Location':'Http://example-2.com/web'
});
res.end();
}).listen(3000,'127.0.0.1');
console.log("Server funning at http://127.0.0.1:3000");
開啟瀏覽器訪問http://127.0.0.1:3000頁面會被重新導向。
響應不同的請求
Node.js不單可以建立單一的響應,對於多種類型的請求,我們需要給應用程式加一些路由。Node通過使用URL模組讓這一切直截了當。URL模組使我們可以讀取URL、分析它然後對輸出做一些事情。
複製代碼 代碼如下:
var url = require('url');
var requestURL = "http://example.com:1234/path?query=string#hash"
現在,我們可以分析請求的URL並從中截取內容,例如,要想獲得主機名稱,我們可以輸入:
複製代碼 代碼如下:
url.parse(requestURL).hostname
這時,他將返回"example.com"
取得連接埠號碼可以輸入:
複製代碼 代碼如下:
url.parse(requestURL).port
他將返回“1234”
事件模組
Node.js被認為是實現並發的最佳方法。Events(事件)模組是Node.js的核心,許多其他模組用它來圍繞著事件架構功能。由於Node.js運行於單一的線程中,任何同步代碼都是阻塞的。所以,在編寫Node.js代碼的時候我們要考慮一些簡單的規則:
1.別阻塞——`Node.js`是單線程的,如果代碼阻塞的話所有其他一切都停止了
2.快速返回——操作應當快速返回。如果不能快速返回,就應當將其遷移到另一個進程中
Events模組讓開發人員可以為事件設定接聽程式和處理器。在用戶端js中,我們可以對單擊事件設定一個監聽器,然後在事件發生時執行一些事情:
複製代碼 代碼如下:
var tar = document.getElementById("target");
tar.addEventListener("click", function () {
alert("click event fired,target was clicked");
},false);
當然,這是在不考慮IE相容性的一個例子,Node.js重時間點事件更常見的是網路事件,包括:
1.來自web伺服器的響應
2.從檔案讀取資料
3.從資料庫返回資料
使用Events模組我們首先要建立一個新的EventEmitter執行個體:
複製代碼 代碼如下:
var EventEmitter= require('events').EventEmitter;
var test = new EventEmitter();
一旦在代碼中加入上述內容,就可以添加事件和接聽程式了,我們可以按如下方法發送事件,比如:
複製代碼 代碼如下:
test.emit('msg','the message send by node');
第一個參數是對事件進行描述的字串,以便用於接聽程式的匹配
為了接收訊息,就必須添加接聽程式,接聽程式在事件觸發時處理它,例如:
複製代碼 代碼如下:
test.on('message',function(data){
console.log(data);
});
Events模組addListener/on,once,removeListener,removeAllListeners,emit等基本的事件監聽模式的方法實現。它與前端DOM樹上的事件並不相同,因為它不存在冒泡,逐層捕獲等屬於DOM的事件行為,也沒有preventDefault()、stopPropagation()、 stopImmediatePropagation() 等處理事件傳遞的方法。
1.類: events.EventEmitter:通過 require('events').EventEmitter 擷取 EventEmitter 類。
2.emitter.on(event, listener):添加一個 listener 至特定事件的 listener 數組尾部。 返回 emitter,方便鏈式調用,下同。
3.emitter.removeListener(event, listener)從一個事件的 listener 數組中刪除一個 listener
4.emitter.listeners(event)返回指定事件的 listener 數組
更多詳情見:Node.js API 文檔
以下代碼展示了一條能在5秒內自我毀滅的機密訊息:
複製代碼 代碼如下:
var EventEmitter = require('events').EventEmitter;
var secretMessage = new EventEmitter();
secretMessage.on('message', function (data) {
console.log(data);
});
secretMessage.on('self destruct', function () {
console.log('the msg is destroyed!');
});
secretMessage.emit('message','this is a secret message.It will self deatruct in 5s');
setTimeout(function () {
secretMessage.emit('self destruct');
},5000);
在這段指令碼中,發送了兩個事件,有兩個接聽程式。當指令碼運行時,訊息事件就發生,並由“message”處理器處理
在Node.js中到處都用EventEmitter,所以掌握它是很重要的。Node.js通過I/O操作獲得的資料並廣泛使用Events模組來支援非同步編程
常見問題集:
問:對於一個事件是否有最大接聽程式數量的限制?
答:預設情況下,如果事件有操作10個接聽程式,它會發出警告。不過,可以使用emitter.setMaxListener(n)來更改這個數量
問:是否可以偵聽所有發送出來的事件?
答:不能。我們需要給每個想要響應的事件建立接聽程式