• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:31:19
    文檔

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

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

    簡介

    中間件機制可以讓我們在一個給定的流程中添加一個處理步驟,從而對這個流程的輸入或者輸出產(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();
    
    

    運行結(jié)果

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

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

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久99精品久久久久久久久久| 国产在线精品一区二区不卡| 国产精品久久久久一区二区三区| 香蕉久久夜色精品升级完成| 99热都是精品久久久久久| 久久青青草原精品国产软件| 国产成人精品综合网站| 午夜福利麻豆国产精品| 色偷偷88888欧美精品久久久| 99精品无人区乱码在线观看| 成人午夜精品网站在线观看| 精品国产免费一区二区三区香蕉| 精品国产美女福利到在线不卡| 欧美成人精品一级高清片| 国产亚洲精品国看不卡| 国产精品美女一区二区视频| 国产精品美女久久久| 国产乱子伦精品免费视频| 国产美女精品一区二区三区| 无码人妻一区二区三区精品视频| 青青草精品视频| 久久夜色精品国产亚洲av| 国产午夜精品无码| 91亚洲精品麻豆| 欧美性videos高清精品| 国产精品综合专区中文字幕免费播放| 亚洲av无码成人精品国产| 国产三级精品三级在线观看专1| 亚洲国产精品成人精品无码区 | 国产精品视频一区二区噜噜| 久久精品国产亚洲精品2020| 夜夜爽一区二区三区精品| 国产精品igao视频网| 欧美高清在线精品一区| 人妻无码久久精品| 国产精品无码无需播放器| 国产精品美女久久久| 国产精品国产三级国产av品爱网 | 亚洲中文字幕久久精品无码喷水| 国产精品成熟老女人视频| 欧美一区二区精品系列在线观看 |