中間件是什麼呢?javascript
中間件就是客戶端http請求發起傳送到服務器和服務器返回響應之間的一些處理函數。java
爲何要使用中間件?express
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,不管是路徑是什麼服務器
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 字符串session
var express = require('express') var app = express()
// 中間件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,只有這二者徹底匹配纔會進入對應的中間件app
如下面的代碼爲例進一步說明中間件的執行順序函數
var express = require('express'); var app = express()
//中間件1 app.use(function(req,res) { console.log('非嚴格'); })
//中間件2 app.use('/public',function(req,res,next) { console.log('半嚴格');
next(); })
//中間件3 app.get('/public',function(req,res) { console.log('嚴格 get'); })
//中間件4 app.post('/public',function(req,res) { console.log('嚴格 post'); })
//中間件5
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'post
若是是下面代碼,請求/public後結果又是怎樣呢?ui
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'); })
app.listen(3000,function() { console.log('running...') })
結果是輸出'嚴格 get',請求到達服務器後,從上往下逐漸匹配,匹配到第二個中間件,進入執行,可是該中間件沒有執行next函數,因此終止spa
綜上所述,咱們能夠知道,第三方中間件的安裝執行是有講究的