【node】模組解析之 http

楊成功發表於2019-02-16

首先簡單對比一下 php 與 nodejs之間的區別

菜鳥教程上寫的很通俗易懂,拿過來:

如果我們使用PHP來編寫後端的程式碼時,需要Apache 或者 Nginx 的HTTP 伺服器,並配上 mod_php5 模組和php-cgi。
從這個角度看,整個”接收 HTTP 請求並提供 Web 頁面”的需求根本不需 要 PHP 來處理。
不過對 Node.js 來說,概念完全不一樣了。使用 Node.js 時,我們不僅僅 在實現一個應用,同時還實現了整個 HTTP 伺服器。

舉個例子,在寫php的時候我們只要處理好邏輯就可以了,php執行遇到錯誤的時候瀏覽器會丟擲。

可是在寫nodejs的時候你會發現神奇的現象:

  1. nodejs有一個地方程式碼寫錯,程式直接崩了,瀏覽器直接500!!
  2. 程式沒有處理好輸出,直接就掛在那了!!

這是最常見的現象,因為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是一個基於事件的伺服器(事件驅動就是這個意思),常用的監聽事件有

  1. request:監聽客戶端請求,在回撥函式中返回兩個引數,req 和 res,分別代表請求和響應
  2. connection :監聽TCP連線建立,在回撥函式中返回引數 socket
  3. close:監聽伺服器關閉

我們常用的就是request事件,socket程式設計一般會用socket.io。

還要說一個關鍵的引數,就是request事件回撥函式的res,負責響應客戶端。如果沒有用res處理響應,就會發生開頭提到的那種現象,請求會掛起。介紹它的3個成員函式:

  1. res.writeHead(statusCode,[heasers]):傳送客戶端響應頭
  2. res.write(data,[encoding]):傳送客戶端響應體(內容),可呼叫多次
  3. res.end():結束響應,否則請求會掛起

基本用法就這麼多,入門必備

相關文章