Node實踐 --- http 模組

蜉蝣生物發表於2018-03-21

在使用 Node.js 開發 網路應用的時候,大多使用框架,如 express、koa等,很少直接使用 http 模組來構建一個伺服器。這裡我們就具體實踐一下。

1、搭建一個簡單的http伺服器

// server.js
const http = require('http')

const server = http.createServer(function(req,res){
  res.writeHead(200, { 'Content-Type' : 'text/plain'})
  res.write('Hello world')
  res.end()
})

server.listen(8000, function(){
  console.log("Listening on port 8000")
})
複製程式碼

建立一個客戶端

// client.js
const http = require('http')

let options = {
  port:8000
}
// 建立http請求
const req = http.request(options, function(res){
  console.log('HTTP headers:', res.headers)

  // 監聽請求的返回資料
  res.on('data', function(chunk){
    console.log('Body :', chunk.toString())
  })
  res.on('end', () => {
    console.log('響應中已無資料。');
  });

})
// 結束併傳送請求
req.end();
複製程式碼

執行上面 server.js  建立了一個 http 伺服器,執行 client.js 建立了一個 http 客戶端請求。


2、建立一個http代理伺服器

在服務端程式開法時,代理伺服器能做很多事情,如:快取檔案、壓縮檔案、廣告攔截、IP過濾等等。在生產環境,通常都是使用 nginx 來做代理伺服器。但是為了理解 http 模組的使用,這裡用 http 模組來建立一個代理伺服器。

根據例項1,可以看出 http.createServer 和 http.request 可以建立服務和傳送請求,所以,代理就可以使用這兩個方法來實現。

const http = require('http')
const url = require('url')

// 建立代理服務
const server = http.createServer(function(req,res){

  console.log('開始請求:', req.url);

  // TODO 可以通過構造 options來請求真正需要的地址
  let options = url.parse(req.url);
  options.headers = req.headers;

  // 建立真實請求
  const proxyReq = http.request(options, function(proxyRes){

    // 監聽資料,返回給瀏覽器
    proxyRes.on('data', function(chunk){
      console.log('返回到代理的資料 :', chunk.toString())
      //給原始請求,準備響應資料
      res.write(chunk, 'binary');
    })

    // 監聽代理請求完成
    proxyRes.on('end', function(){
      console.log('代理結束')

      // 響應完成
      res.end();
    });

    // 傳送頭部資訊給瀏覽器
    res.writeHead(proxyRes.statusCode, proxyRes.headers);

  });

  // 獲取從瀏覽器傳送到代理伺服器的資料
  req.on('data',function(chunk){
    console.log('請求資料大小:', chunk.length)
    // 傳送代理請求
    proxyReq.write(chunk, 'binary');
  })

  // 監聽原始請求結束
  req.on('end',function(){
    console.log('原始請求結束')
    // 傳送代理請求
    proxyReq.end();
  })
})

// 啟動代理伺服器
server.listen(8000, function(){
  console.log("代理服務啟動埠: 8000 ")
})
複製程式碼


相關文章