淺度理解NodeJS的HTTP模組

williamslau發表於2019-03-02

HTTP模組是NodeJS自帶的核心模組,其用法簡單,只要建立一個伺服器,然後監聽埠,整個服務就跑起來啦

let http = require(`http`);
let server = http.createServer(function(req,res){

});
server.listen(8080);
複製程式碼

http模組createServer的callback中,
req(request)代表客戶端的資料,是一個可讀流;
res(response)代表服務端的資料,是一個可寫流;
你可以拿到你想要的資料:

let http = require(`http`);
let server = http.createServer();
server.on(`request`, function (req, res) {
    let buffers = [];
    req.on(`data`, function (data) {
        buffers.push(data);
    });
    req.on(`end`, function () {
        console.log(Buffer.concat(buffers).toString());
        res.write(`hello node`);
        res.end();
    });
});
複製程式碼

request事件是監聽請求的事件,buffers是用來接收服務端發來的buffer資料,在end的時候console出來。res.write是可寫流的write事件,往客戶端寫資料。當然,在這裡我們並不能列印出來buffer因為還少一個請求頭部,接下來,我們用程式碼模擬一下http模組的工作原理,讓你一目瞭然。

服務端的程式碼和上段程式碼差不多,只是我們要接收到客戶端的資料後用請求頭部來判斷資料的格式

let http = require(`http`);
let queryString = require(`querystring`);
let server = http.createServer();
server.on(`request`, function (req, res) {
    let contentType = req.headers[`content-type`];
    let buffers = [];
    req.on(`data`, function (chunk) {
        buffers.push(chunk);
    });
    req.on(`end`, function () {
        let content = Buffer.concat(buffers).toString()
        if(contentType === `application/json`){
            console.log(JSON.parse(content).name)
        }else if(contentType === `application/x-www-form-urlencoded`){
            console.log(queryString.parse(content).name)
        }
        res.end(`hello node`);
    });
});
server.listen(8080);
複製程式碼

客戶端我們把所有請求的頭部資訊整理成一個json然後用response事件拿到客戶端的資料

let http = require(`http`);
let options = {
    hostname: `localhost`,
    port: 8080,
    path: `/`,
    method: `get`,
    // 告訴服務端我當前要給你發什麼樣的資料
    // headers: {     // json資料格式
    //     `Content-Type`: `application/json`,
    //     `Content-Length`: 16,     // 傳輸資料的長度(buffer的長度)
    // },
    headers:{         // 表單資料格式
        `Content-Type`:`application/x-www-form-urlencoded`,
        `Content-Length`:16,
    },
}

let req = http.request(options);
req.on(`response`,function(res){
    res.on(`data`,function(chunk){
        console.log(chunk.toString());
    });
});
// req.end(`{"name":"haha"}`);     // json資料格式
req.end(`name=haha&age=18`);        // 表單資料格式
複製程式碼

然後執行服務端檔案
再用cmd切換到檔案所在目錄執行客戶端檔案

node httpClient.js  //客戶端檔案的名字
複製程式碼

服務端會打出
{ name: `haha`, age: `18` }
客戶端也會打出
hello node
怎麼樣~
經過這個小例子,是不是對http模組的理解更深了點呢

相關文章