經過使用HTTP
模塊的低級API,Node.js
容許咱們建立服務器和客戶端。剛開始學node
的時候,咱們都會遇到以下代碼:html
var http = require('http'); http.createServer(function (req,res) { res.end('Hello World\n'); }).listen(3000,"127.0.0.1"); console.log("Server running 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
狀態碼node
http
頭包含了許多信息,如下是個人百度首頁包含的http
頭的信息:web
因爲個人百度首頁添加了較多的網站,因此這裏的數據和讀者們的可能不同。從中咱們能夠看出百度是web服務器是BWS/1.1
數據庫
下面是剛纔上面那段代碼的http頭部信息:編程
在node中,咱們能夠很容易地建立一個簡單的服務器將訪問者重定向到另一個Web頁面上,其準則以下:api
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)
來更改這個數量
問:是否能夠偵聽全部發送出來的事件? 答:不能。咱們須要給每一個想要響應的事件建立偵聽器