摘要:簡介中間件機制可以讓我們在一個給定的流程中添加一個處理步驟,從而對這個流程的輸入或者輸出產生影響,或者產生一些中作用狀態,或者攔截這個流程。中間件機制和的過濾器類似,這兩者都屬于責任鏈模式的具體實現。
簡介
中間件機制可以讓我們在一個給定的流程中添加一個處理步驟,從而對這個流程的輸入或者輸出產生影響,或者產生一些中作用、狀態,或者攔截這個流程。中間件機制和tomcat的過濾器類似,這兩者都屬于責任鏈模式的具體實現。
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!"); });模擬中間件機制并且模擬實現解析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請求分為請求行、請求頭、和請求體,這三者之間通過 即一個空行來分割,這里假設已經將這三者分開,requestLine(請求行)中有方法類型,請求url,http版本號,這三者通過空格來區分,headers(請求頭)中的各部分通過 來分割,requestBody(請求體)中通過 & 來區分參數
模擬中間件機制
約定 中間件一定是一個函數并且接受 request, response, 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 = []; //存放中間件的一個數組 this.index = 0; //當前執行的中間件在chain中的位置 }, use: function(handle) { //這里默認 handle 是函數,并且這里不做判斷 this.chain.push(handle); }, next: function() { //當調用next時執行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(); //執行下一個中間件 } 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(); //執行下一個中間件 } 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(); //執行下一個中間件 } 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(); //執行下一個中間件 }測試代碼
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 = []; //存放中間件的一個數組 this.index = 0; //當前執行的中間件在chain中的位置 }, use: function(handle) { //這里默認 handle 是函數,并且這里不做判斷 this.chain.push(handle); }, next: function() { //當調用next時執行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(); //執行下一個中間件 } 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(); //執行下一個中間件 } 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(); //執行下一個中間件 } 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(); //執行下一個中間件 } 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"}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84966.html
摘要:目前使用人數眾多。通過利用函數,幫你丟棄回調函數,并有力地增強錯誤處理。這個系列的博客主要講解和的中間件機制,本篇將主要講解的中間件機制。其中間件機制的核心為內部方法的實現。 提到 Node.js 開發,不得不提目前炙手可熱的2大框架 Express 和 Koa。 Express 是一個保持最小規模的靈活的 Node.js Web 應用程序開發框架,為 Web 和移動應用程序提供一組...
摘要:對于的緩存機制來說,策略體現在的頭部信息的字段上,而這些策略根據是否需要重新向服務器端發起請求可以分為強緩存和協商緩存兩大類。接下來就是要介紹,兩類緩存相關相關字段的控制實現了。 概述 緩存的重要性不言而喻,通過網絡請求資源緩慢并且降低了客戶端的用戶體驗,增添了服務端的負擔。很多短期之內不會經常發生變化的資源文件沒必要每次訪問都想服務端進行數據請求,而緩存策略的使用就是為了改善客戶端的...
摘要:沒有耐心閱讀的同學,可以直接前往學習全棧最后一公里。我下面會羅列一些,我自己錄制過的一些項目,或者其他的我覺得可以按照這個路線繼續深入學習的項目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術軟文,閱讀需謹慎,長約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過提供給大家學習的方法,...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網發布的真實大廠前端面經題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復,但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學習參考,學習者閱后也要用心鉆研其中的原理,重要知識需要系統學習、透徹學習,形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...
閱讀 824·2021-09-07 09:58
閱讀 2682·2021-08-31 09:42
閱讀 2855·2019-08-30 14:18
閱讀 3086·2019-08-30 14:08
閱讀 1831·2019-08-30 12:57
閱讀 2758·2019-08-26 13:31
閱讀 1299·2019-08-26 11:58
閱讀 1052·2019-08-23 18:06