摘要:如果不能快速返回,就應當將其遷移到另一個進程中模塊讓開發人員可以為事件設置偵聽器和處理器。我們需要給每個想要響應的事件創建偵聽器
Node.js的http服務器
通過使用HTTP模塊的低級API,Node.js允許我們創建服務器和客戶端。剛開始學node的時候,我們都會遇到如下代碼:
var http = require("http"); http.createServer(function (req,res) { res.end("Hello World "); }).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頭發送的是附加的信息,包括內容類型、服務器發送響應的日期以及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)來更改這個數量
問:是否可以偵聽所有發送出來的事件?
答:不能。我們需要給每個想要響應的事件創建偵聽器
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85399.html
摘要:基礎的端到端的基準測試顯示大約比快八倍。所謂單線程,就是指一次只能完成一件任務。在服務器端,異步模式甚至是唯一的模式,因為執行環境是單線程的,如果允許同步執行所有請求,服務器性能會急劇下降,很快就會失去響應。 模塊 Node.js 提供了exports 和 require 兩個對象,其中 exports 是模塊公開的接口,require 用于從外部獲取一個模塊的接口,即所獲取模塊的 e...
摘要:緩沖模塊起初就是為瀏覽器而設計的,所以能很好的處理編碼的字符串,但不能很好的處理二進制數據。有如下三個主要的流標準輸入標準輸出標準錯誤可讀流如果說,緩沖區是處理原始數據的方式的話,那么流通常是移動數據的方式。該方法讓可讀流繼續觸發事件。 緩沖(buffer)模塊 js起初就是為瀏覽器而設計的,所以能很好的處理unicode編碼的字符串,但不能很好的處理二進制數據。這是Node.js的...
閱讀 1213·2021-11-25 09:43
閱讀 1969·2021-11-11 10:58
閱讀 1187·2021-11-08 13:18
閱讀 2659·2019-08-29 16:25
閱讀 3509·2019-08-29 12:51
閱讀 3307·2019-08-29 12:30
閱讀 748·2019-08-26 13:24
閱讀 3683·2019-08-26 10:38