1. 程式人生 > 實用技巧 >對於Node中Express框架的中介軟體概念的感知

對於Node中Express框架的中介軟體概念的感知

中介軟體是什麼呢?

中介軟體就是客戶端http請求發起傳送到伺服器和伺服器返回響應之間的一些處理函式。

為什麼要使用中介軟體?

通過中介軟體,可以對資料進行操作使得我們能方便地操作請求資料編寫伺服器響應。如body-parse中介軟體對post請求的引數進行處理讓我們可以通過res.body快速獲取請求引數,express-session中介軟體可以讓我們對資料進行儲存,express.static是express內建中介軟體,可以讓我們快速處理靜態資源,express.Router路由中介軟體等等

中介軟體如何使用?

Express中,對中介軟體進行了幾種分類: 1.不關心請求路徑和請求方法的中介軟體,通過app.use函式實現app.use(function(req,res,next){}) 客戶端發起的任意請求都會經過這個中介軟體函式進行處理 next指下一個滿足路徑條件的中介軟體,如果有執行next,那麼這個中介軟體執行完後就會執行下一個滿足條件的中介軟體,如果沒有next,就會忽略後面所有中介軟體 以下面程式碼為例(設伺服器ip為127.0.0.1,後面所有例子都以該ip為例)
var
express = require('express') var app = express() app.use(function(req,res) { res.end('404 NOT FOUND') } app.listen(3000,function(){ console.log('running...'); }

所有對該伺服器的請求最終都會返回404 NOT FOUND,無論是路徑是什麼

2.關心請求路徑的中介軟體,通過app.use函式實現app.use(路徑,function(req,res,next){}) 客戶端發起的以第一個引數開頭的路徑才會進入該中介軟體 以下程式碼為例
var express  = require('express')
var app = express()
 
app.use('/public',function(req,res,next) {
    res.end('you are public');
}
 
app.listen(3000,function(){
    console.log('running...')
}

只要客戶端訪問該伺服器的地址是以public開頭(即127.0.0.1:3000/public/xxx),那麼就會返回you are public 字串

3.嚴格匹配路徑的中介軟體,通過app.get/app.post等實現 也就是我們所說的伺服器路由
app.get(路徑,函式)
app.post(路徑,函式)
只有嚴格匹配請求方式和請求路徑的請求才會進入該中介軟體 以下面程式碼為例
var express = require('express')
var app = express()
<br>// 中介軟體1
app.get('/get/puclic',function(req,res){
    res.end('get!');
}
 
// 中介軟體2
app.post('/post/public',function(req,res) {
    res.end('post!');
}
 
app.listen(3000,function(){
    console.log('running...');
}

客戶端只有通過get方式訪問127.0.0.1:3000/get/public時才會進入中介軟體1,只有通過post方式訪問127.0.0.1:3000/post/public時才會進入中介軟體2,只有這兩者完全匹配才會進入對應的中介軟體

中介軟體的執行機制:

1.中介軟體的第一次執行是同步的,當一個請求發出到達伺服器後,則按照順序匹配所有中介軟體,當找到一個匹配時,則進入該中介軟體 2.如果該中介軟體最後沒有執行next函式,則該請求在此中介軟體終止,不再進入後面的中介軟體;如果有,則會直接進入後面匹配的中介軟體中(此時不再是按順序!) 3.重複1-2步 如果把客戶端發起請求和伺服器發出響應比作自來水的進入水庫和輸出水庫,那麼中介軟體就是水庫裡對水分別進行過濾沉澱消毒的各個小廠房,而中介軟體的函式的next引數就相當於每個小廠房的門,只有這個門打開了,處理完的請求的資料才能繼續向後面的中介軟體傳送,直至響應發出。

以下面的程式碼為例進一步說明中介軟體的執行順序

var express = require('express');
 
var app = express()
<br>//中介軟體1
app.use(function(req,res) {
    console.log('非嚴格');
})
<br>//中介軟體2
app.use('/public',function(req,res,next) {
    console.log('半嚴格');<br>    next();
})
<br>//中介軟體3
app.get('/public',function(req,res) {
    console.log('嚴格 get');
})
<br>//中介軟體4
app.post('/public',function(req,res) {
    console.log('嚴格 post');
})<br><br>//中介軟體5<br>app.get('/public',function(req,res) {
    console.log('嚴格 get');
})
app.listen(3000,function() { console.log('running...') })

此時客戶端訪問/public,那麼首先會進入中介軟體1,因為有執行next函式,所以直接尋找後面能夠匹配的中介軟體,進入中介軟體2,中間有執行next函式,所以進入中介軟體3,但是中介軟體3沒有next函式,所以不再執行,所以輸出的語句是‘非嚴格’ '半嚴格' '嚴格 get'

如果是下面程式碼,請求/public後結果又是怎樣呢?

var express = require('express');
 
var app = express()
 
 
app.use('/img',function(req,res) {
    console.log('半嚴格');
})
 
app.get('/public',function(req,res) {
    console.log('嚴格 get');
})
 
app.post('/public',function(req,res) {
    console.log('嚴格 post');
})<br><br>
app.listen(3000,function() { console.log('running...') })

結果是輸出'嚴格 get',請求到達伺服器後,從上往下逐漸匹配,匹配到第二個中介軟體,進入執行,但是該中介軟體沒有執行next函式,所以終止

PPT模板下載大全https://www.wode007.com

綜上所述,我們可以知道,第三方中介軟體的安裝執行是有講究的

對於一些封裝請求資料方便我們操作以及處理靜態資源的中介軟體我們應該放在路由中介軟體(即有發出伺服器響應的中介軟體)之前編寫,否則在編寫路由時就無法使用封裝好的資料。而對於返回404頁面的路由可以放在所有中介軟體後面,這樣無法找到的頁面則會自動匹配到最後一個返回404頁面 中介軟體的使用是靈活多變的,本文章只是簡單概述其概念及其執行機制,更多技巧仍需讀者自行體會