Dieser Artikel stellt hauptsächlich den Express-Middleware-Mechanismus und das Implementierungsprinzip vor. Der Herausgeber findet ihn ziemlich gut. Jetzt werde ich ihn mit Ihnen teilen und als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf.
Einführung
Der Middleware-Mechanismus ermöglicht es uns, einem bestimmten Prozess einen Verarbeitungsschritt hinzuzufügen, wodurch die Eingabe bzw Die Ausgabe dieses Prozesses hat Auswirkungen oder erzeugt Zwischeneffekte, Zustände oder unterbricht diesen Prozess. Der Middleware-Mechanismus ähnelt dem Filter von Tomcat, beide sind spezifische Implementierungen des Chain-of-Responsibility-Modells.
Express-Middleware-Anwendungsfall
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!'); });
Simulieren Sie den Middleware-Mechanismus und simulieren Sie die Implementierung der Analyse Die Anfrage Die Middleware
simuliert zunächst eine request
request = { //模拟的request requestLine: 'POST /iven_ HTTP/1.1', headers: 'Host:m.sbmmt.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0', requestBody: 'key1=value1&key2=value2&key3=value3', }
Eine http
Anfrage wird in eine Anfragezeile unterteilt , Anforderungsheader und Anforderungstext, diese drei werden durch rnrn
getrennt, was eine Leerzeile ist. Es wird davon ausgegangen, dass diese drei getrennt wurden: requestLine
(Anforderungszeile) enthält Methodentyp, Anforderungs-URL und http-Versionsnummer , Die drei werden durch Leerzeichen unterschieden, jeder Teil in headers
(Anfragekopf) wird durch rn
getrennt und die Parameter in requestBody
(Anfragetext) werden durch &
Simulation unterschieden Mitte Der Middleware-Mechanismus
stimmt zu, dass die Middleware eine Funktion sein und drei Parameter akzeptieren muss: Anfrage, Antwort, Weiter
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:m.sbmmt.com\r\nCookie: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)); }, }
Ja, Middleware zur Verarbeitung anfordern
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('\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(); //执行下一个中间件 } 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(); //执行下一个中间件 }
Testcode
let app = App(); app.use(lineParser); app.use(headersParser); app.use(bodyParser); app.use(middleware3); app.next();
Gesamtcode
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:m.sbmmt.com\r\nCookie: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('\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(); //执行下一个中间件 } 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();
Laufergebnisse
Führen Sie das Obige insgesamt aus Code Die folgenden Informationen werden gedruckt
url: /iven_ methond: POST version: HTTP/1.1 {key1: "value1", key2: "value2", key3: "value3"} {Host: "m.sbmmt.com", Cookie: "BAIDUID=E063E9B2690116090FE24E01ACDDF4AD"}
Das obige ist der detaillierte Inhalt vonAnalysieren Sie den Express-Middleware-Mechanismus und sein Implementierungsprinzip. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!