成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

everfight / 639人閱讀

摘要:簡介中間件機制可以讓我們在一個給定的流程中添加一個處理步驟,從而對這個流程的輸入或者輸出產(chǎn)生影響,或者產(chǎn)生一些中作用狀態(tài),或者攔截這個流程。中間件機制和的過濾器類似,這兩者都屬于責任鏈模式的具體實現(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
Cookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0",
    requestBody: "key1=value1&key2=value2&key3=value3",
}

一個http請求分為請求行、請求頭、和請求體,這三者之間通過 即一個空行來分割,這里假設已經(jīng)將這三者分開,requestLine(請求行)中有方法類型,請求url,http版本號,這三者通過空格來區(qū)分,headers(請求頭)中的各部分通過 來分割,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
Cookie: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("
");
    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
Cookie: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("
");
    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"}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84966.html

相關(guān)文章

  • Express與Koa間件機制分析(一)

    摘要:目前使用人數(shù)眾多。通過利用函數(shù),幫你丟棄回調(diào)函數(shù),并有力地增強錯誤處理。這個系列的博客主要講解和的中間件機制,本篇將主要講解的中間件機制。其中間件機制的核心為內(nèi)部方法的實現(xiàn)。 提到 Node.js 開發(fā),不得不提目前炙手可熱的2大框架 Express 和 Koa。 Express 是一個保持最小規(guī)模的靈活的 Node.js Web 應用程序開發(fā)框架,為 Web 和移動應用程序提供一組...

    zilu 評論0 收藏0
  • 詳談HTTP的緩存機制原理

    摘要:對于的緩存機制來說,策略體現(xiàn)在的頭部信息的字段上,而這些策略根據(jù)是否需要重新向服務器端發(fā)起請求可以分為強緩存和協(xié)商緩存兩大類。接下來就是要介紹,兩類緩存相關(guān)相關(guān)字段的控制實現(xiàn)了。 概述 緩存的重要性不言而喻,通過網(wǎng)絡請求資源緩慢并且降低了客戶端的用戶體驗,增添了服務端的負擔。很多短期之內(nèi)不會經(jīng)常發(fā)生變化的資源文件沒必要每次訪問都想服務端進行數(shù)據(jù)請求,而緩存策略的使用就是為了改善客戶端的...

    Jason_Geng 評論0 收藏0
  • 全棧最后一公里 - Node.js 項目的線上服務器部署與發(fā)布

    摘要:沒有耐心閱讀的同學,可以直接前往學習全棧最后一公里。我下面會羅列一些,我自己錄制過的一些項目,或者其他的我覺得可以按照這個路線繼續(xù)深入學習的項目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術(shù)軟文,閱讀需謹慎,長約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過提供給大家學習的方法,...

    Nosee 評論0 收藏0
  • 前端面試題大集合:來自真實大廠的532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W(wǎng)發(fā)布的真實大廠前端面經(jīng)題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復,但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學習參考,學習者閱后也要用心鉆研其中的原理,重要知識需要系統(tǒng)學習、透徹學習,形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...

    Kerr1Gan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<