任何可使用JavaScript來編寫的應用,最終會由JavaScript編寫。--Atwood's Lawnode
http模塊主要用於建立http server服務,而且web
藉助http模塊,能夠幾行代碼就搞定一個超迷你的web server:服務器
var http=require("http") http.createServer(function(req, res){ res.writeHead(200,{ "content-type":"text/plain" }) res.write("hello nodejs") res.end() }).listen(3000)
像上面同樣使用的createServer方法返回了一個http.Server對象,這實際上是一個建立http服務的捷徑,若是咱們用如下代碼來實現的話,也將同樣可行異步
var http = require("http") var server = new http.Server() server.on("request", function(req, res){ res.writeHead(200, { "content-type":"text/plain" }) res.write("hello nodejs") res.end() }) server.listen(3000)
以上代碼是經過直接建立一個http.Server對象,而後爲其添加request事件監聽,其實也就說createServer方法其實本質上也是爲http.Server對象添加了一個request事件監聽。socket
http.Server繼承自 net.Server,http.Server提供的事件以下:函數
正如上面咱們所看到的request事件是最經常使用的,而參數req和res分別是http.IncomingMessage和http.ServerResponse的實例,那麼咱們來看看這兩個類ui
在server端:獲取請求發送方的信息,好比請求方法、路徑、傳遞的數據等。
在client端:獲取 server 端發送過來的信息,好比請求方法、路徑、傳遞的數據等。編碼
http.IncomingMessage實例 有三個屬性須要注意:method、statusCode、statusMessage。url
而且其提供了3個事件,以下code
http.ServerResponse 的做用很明確,服務端經過http.ServerResponse 實例,來個請求方發送數據。包括髮送響應表頭,發送響應主體等。它決定了用戶最終看到的內容,通常也由http.Server的request事件發送,並做爲第二個參數傳遞,它有三個重要的成員函數,用於返回響應頭、響應內容以及結束請求
http模塊提供了兩個函數http.request和http.get,功能是做爲客戶端向http服務器發起請求。
var http = require('http') // http server var server = http.createServer(function(req, res){ var url = req.url res.end( '您訪問的地址是:' + url ) }) server.listen(3000) // http client var client = http.get('http://127.0.0.1:3000', function(res){ res.setEncoding("utf-8") res.on("data",function(chunk){ console.log(chunk.toString()) }) console.log(res.statusCode); }) client.on("error",function(err){ console.log(err.message) }) client.end()
此對象由 http.request()
內部建立並返回。 它表示正在進行的請求,且其請求頭已進入隊列。 請求頭仍然可使用 setHeader(name, value)
、getHeader(name)
或 removeHeader(name)
改變。 實際的請求頭將與第一個數據塊一塊兒發送,或者當調用 request.end()
時發送。
要得到響應,則爲請求對象添加 'response'
事件監聽器。 當接收到響應頭時,將、則會從請求對象觸發 'response' 事件。 'response' 事件執行時有一個參數,該參數是 http.IncomingMessage 的實例。
在 'response'
事件期間,能夠添加監聽器到響應對象,好比監聽 'data'
事件。
若是沒有添加 'response' 事件處理函數,則響應將被徹底丟棄。 若是添加了 'response' 事件處理函數,則必須消費完響應對象中的數據,每當有 'readable' 事件時調用 response.read()、或添加 'data' 事件處理函數、或經過調用 .resume() 方法。 在消費完數據以前,不會觸發 'end' 事件。 此外,在讀取數據以前,它將佔用內存,最終可能致使進程內存不足的錯誤。
Node.js 不檢查 Content-Length 和已傳輸的主體的長度是否相等。
請求繼承自流,且額外實現如下內容: