首先簡單對比一下 php 與 nodejs之間的區別
菜鳥教程上寫的很通俗易懂,拿過來:
如果我們使用PHP來編寫後端的程式碼時,需要Apache 或者 Nginx 的HTTP 伺服器,並配上 mod_php5 模組和php-cgi。
從這個角度看,整個”接收 HTTP 請求並提供 Web 頁面”的需求根本不需 要 PHP 來處理。
不過對 Node.js 來說,概念完全不一樣了。使用 Node.js 時,我們不僅僅 在實現一個應用,同時還實現了整個 HTTP 伺服器。
舉個例子,在寫php的時候我們只要處理好邏輯就可以了,php執行遇到錯誤的時候瀏覽器會丟擲。
可是在寫nodejs的時候你會發現神奇的現象:
- nodejs有一個地方程式碼寫錯,程式直接崩了,瀏覽器直接500!!
- 程式沒有處理好輸出,直接就掛在那了!!
這是最常見的現象,因為nodejs不依賴web伺服器,它自身處理請求和響應
1. 解析 hollow world
var http = require(`http`);
http.createServer(function (request, response) {
response.writeHead(200, {`Content-Type`: `text/plain`});
response.end(`Hello World
`);
}).listen(8080);
console.log(`Server running at http://127.0.0.1:8080/`);
程式碼中createServer
是一個快捷方法,還原之後是這樣的:
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 World
");
res.end();
});
server.listen(8080);
http模組中封裝了一個Http伺服器和一個Http客戶端,分別對應http.Server()
和http.request()
。前者的作用是建立一個http伺服器,後者的作用是對http伺服器發起請求
所以createServer方法就是例項化一個 http.Server() 伺服器,監聽request事件,然後發出響應。同時監聽8080埠
2. http.Server
http.Server是一個基於事件的伺服器(事件驅動就是這個意思),常用的監聽事件有
-
request
:監聽客戶端請求,在回撥函式中返回兩個引數,req 和 res,分別代表請求和響應 -
connection
:監聽TCP連線建立,在回撥函式中返回引數 socket -
close
:監聽伺服器關閉
我們常用的就是request
事件,socket程式設計一般會用socket.io。
還要說一個關鍵的引數,就是request事件回撥函式的res
,負責響應客戶端。如果沒有用res處理響應,就會發生開頭提到的那種現象,請求會掛起。介紹它的3個成員函式:
-
res.writeHead(statusCode,[heasers])
:傳送客戶端響應頭 -
res.write(data,[encoding])
:傳送客戶端響應體(內容),可呼叫多次 -
res.end()
:結束響應,否則請求會掛起
基本用法就這麼多,入門必備