最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談express 中間件機制及實現(xiàn)原理

 更新時間:2017年08月31日 10:20:12   作者:_ivenj  
本篇文章主要介紹了淺談express 中間件機制及實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

簡介

中間件機制可以讓我們在一個給定的流程中添加一個處理步驟,從而對這個流程的輸入或者輸出產(chǎn)生影響,或者產(chǎn)生一些中作用、狀態(tài),或者攔截這個流程。中間件機制和tomcat的過濾器類似,這兩者都屬于責任鏈模式的具體實現(xiàn)。

express 中間件使用案例

let express = require('express')
let app = express()
//解析request 的body
app.use(bodyParser.json())
//解析 cookie
app.use(cookieParser())
//攔截
app.get('/hello', function (req, res) {
 res.send('Hello World!');
});

模擬中間件機制并且模擬實現(xiàn)解析request的中間件

首先模擬一個request

request = { //模擬的request
  requestLine: 'POST /iven_ HTTP/1.1',
  headers: 'Host:www.baidu.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0',
  requestBody: 'key1=value1&key2=value2&key3=value3',
}

一個http請求分為請求行、請求頭、和請求體,這三者之間通過\r\n\r\n即一個空行來分割,這里假設已經(jīng)將這三者分開,requestLine(請求行)中有方法類型,請求url,http版本號,這三者通過空格來區(qū)分,headers(請求頭)中的各部分通過\r\n來分割,requestBody(請求體)中通過 & 來區(qū)分參數(shù)

模擬中間件機制

約定 中間件一定是一個函數(shù)并且接受 request, response, next三個參數(shù)

function App() {
  if (!(this instanceof App))
    return new App();
  this.init();
}
App.prototype = {
  constructor: App,
  init: function() {
    this.request = { //模擬的request
      requestLine: 'POST /iven_ HTTP/1.1',
      headers: 'Host:www.baidu.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0',
      requestBody: 'key1=value1&key2=value2&key3=value3',
    };
    this.response = {}; //模擬的response
    this.chain = []; //存放中間件的一個數(shù)組
    this.index = 0; //當前執(zhí)行的中間件在chain中的位置
  },
  use: function(handle) { //這里默認 handle 是函數(shù),并且這里不做判斷
    this.chain.push(handle);
  },
  next: function() { //當調(diào)用next時執(zhí)行index所指向的中間件
    if (this.index >= this.chain.length)
      return;
    let middleware = this.chain[this.index];
    this.index++;
    middleware(this.request, this.response, this.next.bind(this));
  },
}

對 request 處理的中間件

 function lineParser(req, res, next) {
    let items = req.requestLine.split(' ');
    req.methond = items[0];
    req.url = items[1];
    req.version = items[2];
    next(); //執(zhí)行下一個中間件
  }

function headersParser(req, res, next) {
  let items = req.headers.split('\r\n');
  let header = {}
  for(let i in items) {
    let item = items[i].split(':');
    let key = item[0];
    let value = item[1];
    header[key] = value;
  }
  req.header = header;
  next(); //執(zhí)行下一個中間件
}

function bodyParser(req, res, next) {
  let bodyStr = req.requestBody;
  let body = {};
  let items = bodyStr.split('&');
  for(let i in items) {
    let item = items[i].split('=');
    let key = item[0];
    let value = item[1];
    body[key] = value;
  }
  req.body = body;
  next(); //執(zhí)行下一個中間件
}

function middleware3(req, res, next) {
  console.log('url: '+req.url);
  console.log('methond: '+req.methond);
  console.log('version: '+req.version);
  console.log(req.body);
  console.log(req.header);
  next(); //執(zhí)行下一個中間件
}

測試代碼

let app = App();
app.use(lineParser);
app.use(headersParser);
app.use(bodyParser);
app.use(middleware3);
app.next();

整體代碼

function App() {
  if (!(this instanceof App))
    return new App();
  this.init();
}
App.prototype = {
  constructor: App,
  init: function() {
    this.request = { //模擬的request
      requestLine: 'POST /iven_ HTTP/1.1',
      headers: 'Host:www.baidu.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0',
      requestBody: 'key1=value1&key2=value2&key3=value3',
    };
    this.response = {}; //模擬的response
    this.chain = []; //存放中間件的一個數(shù)組
    this.index = 0; //當前執(zhí)行的中間件在chain中的位置
  },
  use: function(handle) { //這里默認 handle 是函數(shù),并且這里不做判斷
    this.chain.push(handle);
  },
  next: function() { //當調(diào)用next時執(zhí)行index所指向的中間件
    if (this.index >= this.chain.length)
      return;
    let middleware = this.chain[this.index];
    this.index++;
    middleware(this.request, this.response, this.next.bind(this));
  },
}
function lineParser(req, res, next) {
    let items = req.requestLine.split(' ');
    req.methond = items[0];
    req.url = items[1];
    req.version = items[2];
    next(); //執(zhí)行下一個中間件
  }

function headersParser(req, res, next) {
  let items = req.headers.split('\r\n');
  let header = {}
  for(let i in items) {
    let item = items[i].split(':');
    let key = item[0];
    let value = item[1];
    header[key] = value;
  }
  req.header = header;
  next(); //執(zhí)行下一個中間件
}

function bodyParser(req, res, next) {
  let bodyStr = req.requestBody;
  let body = {};
  let items = bodyStr.split('&');
  for(let i in items) {
    let item = items[i].split('=');
    let key = item[0];
    let value = item[1];
    body[key] = value;
  }
  req.body = body;
  next(); //執(zhí)行下一個中間件
}

function middleware3(req, res, next) {
  console.log('url: '+req.url);
  console.log('methond: '+req.methond);
  console.log('version: '+req.version);
  console.log(req.body);
  console.log(req.header);
  next(); //執(zhí)行下一個中間件
}
let app = App();
app.use(lineParser);
app.use(headersParser);
app.use(bodyParser);
app.use(middleware3);
app.next();

運行結果

將以上整體代碼運行后將打印以下信息

url: /iven_
methond: POST
version: HTTP/1.1
{key1: "value1", key2: "value2", key3: "value3"}
{Host: "www.baidu.com", Cookie: "BAIDUID=E063E9B2690116090FE24E01ACDDF4AD"}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • nodejs 使用 js 模塊的方法實例詳解

    nodejs 使用 js 模塊的方法實例詳解

    這篇文章主要介紹了nodejs 使用 js 模塊的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-12-12
  • Centos7 安裝Node.js10以上版本的方法步驟

    Centos7 安裝Node.js10以上版本的方法步驟

    這篇文章主要介紹了Centos7 安裝Node.js10以上版本的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • nodejs連接mongodb數(shù)據(jù)庫實現(xiàn)增刪改查

    nodejs連接mongodb數(shù)據(jù)庫實現(xiàn)增刪改查

    本篇文章主要結合了nodejs操作mongodb數(shù)據(jù)庫實現(xiàn)增刪改查,包括對數(shù)據(jù)庫的增加,刪除,查找和更新,有興趣的可以了解一下。
    2016-12-12
  • node.js中的console.dir方法使用說明

    node.js中的console.dir方法使用說明

    這篇文章主要介紹了node.js中的console.dir方法使用說明,本文介紹了console.dir的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Sequelize中用group by進行分組聚合查詢

    Sequelize中用group by進行分組聚合查詢

    大家都知道在SQL查詢中,分組查詢是較常用的一種查詢方式。分組查詢是指通過GROUP BY關鍵字,將查詢結果按照一個或多個字段進行分組,分組時字段值相同的會被分為一組。在Node.js基于Sequelize的ORM框架中,同樣支持分組查詢,使用非常簡單方便。下面來看看詳細的介紹。
    2016-12-12
  • node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小

    node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小

    這篇文章主要介紹了node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小的相關資料,需要的朋友可以參考下
    2017-01-01
  • Node.js重新刷新session過期時間的方法

    Node.js重新刷新session過期時間的方法

    在Node.js中,我們通常使用express-session這個包來使用和管理session,保存服務端和客戶端瀏覽器之間的會話狀態(tài)。那如何才能實現(xiàn)當用戶刷新當前頁面或者點擊頁面上的按鈕時重新刷新session的過期時間呢,接下來通過本文一起學習吧
    2016-02-02
  • 淺談Nodejs應用主文件index.js

    淺談Nodejs應用主文件index.js

    這篇文章主要介紹了淺談Nodejs應用主文件index.js的相關資料,需要的朋友可以參考下
    2016-08-08
  • node.js中的buffer.copy方法使用說明

    node.js中的buffer.copy方法使用說明

    這篇文章主要介紹了node.js中的buffer.copy方法使用說明,本文介紹了buffer.copy的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 基于npm?install或run時一些報錯的解決方案

    基于npm?install或run時一些報錯的解決方案

    這篇文章主要介紹了基于npm?install或run時一些報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論

北宁市| 松江区| 通河县| 隆子县| 城市| 昆明市| 涡阳县| 常宁市| 赤水市| 从江县| 工布江达县| 宾川县| 鄂托克前旗| 赣榆县| 石首市| 沙坪坝区| 东光县| 广宗县| 延庆县| 屯留县| 富裕县| 留坝县| 大田县| 宿迁市| 定边县| 吉林市| 桦南县| 靖宇县| 乌鲁木齐市| 津南区| 京山县| 长乐市| 图木舒克市| 九江市| 扎兰屯市| 葵青区| 安福县| 西畴县| 古丈县| 大港区| 南通市|