深入淺出 Node ( 四 ) HTTP核心模組

Meils發表於2019-02-16

HTTP

建立一個伺服器

var http = require(`http`);
var fs = require(`fs`);
var url = require(`url`);

var serverHandle = function(req, res) {
  var pathname = url.parse(req.url).pathname; // 對請求的url進行分析,取得pathname
  console.log(url.parse(req.url));
  console.log(url.parse(req.url).pathname);
  // 消除favicon.ico影響
  if (req.url !== "/favicon.ico")
    console.log(req.url); //消除/favicon.ico的影響

  console.log(pathname);
  // 讀取檔案
  fs.readFile(pathname.substr(1), function(err, data) {
    if (err) {
      console.log(err);
      res.writeHead(404, {"Content-Type": "text/html"});
    } else {
      res.writeHead(200, {"Content-Type": "text/html"});
      res.end(data.toString());
    }
  })
};

var server = http.createServer(serverHandle);

server.listen(3000);

console.log(`http is running at 127.0.0.1:3000`);

監聽連線和請求

var http = require(`http`);

var server = http.createServer(); // 返回一個http.server例項

// 【一】
// 監聽request事件,每接受到一個請求的時候觸發
// 當服務端接收到客戶端請求時,觸發request事件,所以可以使用監聽request事件的方式來代替createServer中的回撥函式:
server.on(`request`, function(req,res) {
  //接收到客戶端請求的連線後程式碼部分
})

// 【二】
// 【監聽客戶端的連結】
// server.listen(port,[host],[backlog],[callback]);
server.listen(3000,127.0.0.1);

/*
port:       監聽的埠號,0表示為伺服器隨機分配一個埠號。
host:       監聽的地址,預設為本機(localhost)
backlog:   指定位於[等待佇列中]的客戶端連線的[最大數量]。超過此數量,則伺服器拒絕新的客戶端請求。
callback:  開啟監聽後觸發的回撥函式。當伺服器開啟監聽後會觸發listening事件,可以通過監聽listening事件來代替callback回撥函式。
 */

server.on(`listening`, function(){
  console.log(`我監聽連線,並且執行此回撥函式!!`);
})

connection 和 request的區別


// 預設情況下,客戶端與服務端每進行依次HTTP互動就進行一次連線,在HTTP1.1之後新增了長連線,
// 如果在客戶端傳送請求頭資訊中或伺服器傳送的響應頭資訊中包含“Connection: keep-live”資訊,則HTTP連線將繼續保持。


// 當客戶端與伺服器建立連線時,會觸發伺服器物件的connection事件,可以通過監聽connection事件來處理連線後的事情,此時回撥引數為socket物件。

server.on(`connection`, function(socket) {
  console.log(socket);
})

** connection 和 request的區別
客戶端與服務端每次建立連線的時候會觸發connection事件,
當服務端接受到客戶端請求的時候,就會觸發request事件。傳送請求是建立在雙方已經成功連線的接觸之上

通過請求獲取客戶端資訊

當客戶端與伺服器連線後,伺服器可以通過 http.IncommingMessage 例項化的物件(createServer方法中回撥函式的第一個引數)的一些屬性和方法來獲取客戶端的請求資訊和讀取客戶端請求的資料。

* method:   客戶端請求方式
* url:      請求的地址
* headers:  客戶端傳送的請求頭資訊
* httpVersion: HTTP請求版本
* trailers: 客戶端傳送的trailers物件資訊。只有IncommingMessage物件的end事件觸發後才能讀取到該資訊。
* socket:   伺服器端監聽客戶端請求的socket物件。
* data事件: 當伺服器接收到客戶端傳送的請求資料時觸發data事件。
* end事件:  當客戶端傳送給伺服器資料執行完畢時觸發end事件。
var http = require(`http`);

var serverHandle = function(req,res) {
  console.log(req);
  req.on("data",function(data){
        console.log("接收到的資料:"+decondeURIComponent(data));
    });

  req.on("end",function(){
        console.log("資料接收完畢");
    });
}

var server = http.createServer(serverHandle);

server.listen(3000);
server.on(`listening`, function() {
  console.log(`伺服器啟動中~~~`);
})
// 一個簡單的get請求,獲取資訊
var http = require(`http`);
var url = require(`url`);
var util = require(`util`);

var serverHandle = function(req,res) {
  var parse = url.parse(req.url,true).query;
  res.write(`name`+ parse.name);
  res.write(`url`+ parse.url);
  res.end();
}

var server = http.createServer(serverHandle);

server.listen(3000);
server.on(`listening`, function() {
  console.log(`伺服器啟動中~~~`);
})

// http://localhost:3000/?url=123&name=321

響應客戶端資訊

利用http.ServerResponse物件(createServer方法或request事件處理方法的第二個引數)向客戶端傳送資料。

相關文章