1. 程式人生 > 其它 >執行在服務端的JavaScript——node.js(五)

執行在服務端的JavaScript——node.js(五)

中介軟體

中間接的概念

Express 中介軟體的呼叫流程

當一個請求到達Express的伺服器之後,可以連續呼叫多箇中間件,從而對這次請求進行預處理


Express中介軟體的格式

Express的中介軟體,本質上就是function處理函式,Express中介軟體的格式如下:

中介軟體函式的形參列表中,必須包含next引數。而路由處理函式中只包含req和res

next函式的作用

next函式是實現多箇中間連續呼叫的關鍵,它表示把流轉關係轉交給下一個中介軟體或路由。


Express 中介軟體的初體驗

定義中介軟體函式

可以通過如下方式,定義一個最簡單的中介軟體函式:

// 常量 mw 所指向的,就是一箇中間件函式
const mw = function(req,res,next){
    console.log('這是一個最簡單的中介軟體函式');
    // 注意:當前中介軟體的業務處理完畢後,必須呼叫next()函式
    // 表示把流轉關係轉交給下一個中介軟體或路由
    next()
}

全域性生效的中介軟體

客戶端發起的任何請求,到達伺服器之後,都會觸發的中介軟體,叫做全域性生效的中介軟體。
通過呼叫app.use(中介軟體函式),即可定義一個全域性生效的中介軟體,示例程式碼如下:

// 常 mw 所指向的,就是一箇中間件函式
const mw = function(req,res,next){
    console.lgo('這是最簡單的中介軟體函式')
    next()
}

// 全域性生效的中介軟體
app.use(mw)

定義全域性中介軟體的簡化形式

// 全域性生效的中介軟體
app.use(function(req,res,next){
    console.log('這是一個最簡單的中介軟體函式')
    next()
})

中介軟體的作用

多箇中間件之間,共享一份req和res。基於這樣的特性,我們可以在上游的中介軟體中,統一為req或res物件新增自定義的屬性和方法,供下游的中介軟體或路由進行使用。



定義多箇中間件

可以使用app.use()連續定義多個全域性中介軟體。客戶端請求到達伺服器之後,會按照中介軟體定義的先後順序依次進行呼叫。

區域性生效的中介軟體

不使用app.use()定義的中介軟體,叫做區域性生效的中介軟體,示例程式碼如下:

// 定義中介軟體函式 mw1
const mw1 = function(req,res,next){
    console.log('這是中介軟體函式')
    next()
}
// mw1 這個中間路由只在“當前路由中生效”,這種用法屬於“區域性生效的中介軟體”
app.get('/',mw1,function(req,res){
    res.send('Home page.')
})
// mw1 這個中介軟體不會影響下面這個路由
app.get('/user',function(req,res){res.send('User page')})

定義多個區域性中介軟體

可以在路由中,通過如下兩種等價方式,使用多個區域性中介軟體:

// 以下兩種寫法是“完全等價”的,可以根據自己的喜好,選擇任意一種方式進行使用
app.get('/',mw1,mw2,(req,res)=>{ res.send('Home page') })
app.get('/',[mw1,mw2],(req,res)=>{res.send('Home.page')})

瞭解中介軟體的五個使用注意事項

  1. 一定要在路由之前註冊中介軟體

  2. 客戶端傳送過來的請求,可以連續呼叫多箇中間件進行處理

  3. 執行完中介軟體的業務程式碼之後,不要忘記呼叫next()函式

  4. 為了防止程式碼邏輯混亂,呼叫完next()函式後不要再寫額外程式碼

  5. 連續呼叫多箇中間件時,多箇中間件之間,共享req和res物件

中介軟體的分類

為了方便理解和記憶中介軟體的使用,Express官方把常見的中介軟體用法,分成了5大類,分別是:

  1. 應用級別的中介軟體

  2. 路由級別的中介軟體

  3. 錯誤級別的中介軟體

  4. Express 內建的中介軟體

  5. 第三方的中介軟體

應用級別的中介軟體

通過 app.use()app.get()app.post(),繫結到app例項上的中介軟體,叫做應用級別的中介軟體,程式碼示例如下:

// 應用級別的中介軟體(全域性中介軟體)
app.use((req,res)=>{
    next()
})

// 應用級別的中介軟體(區域性中介軟體)
app.get('/',mw1,(req,res)=>{
    res.send('Home page.')
})

路由級別的中介軟體

繫結到 express.Router()例項上的中介軟體,叫做路由級別的中介軟體。它的用法和應用級別中介軟體沒有任何區別。只不過,應用級別中介軟體時繫結到app例項上,路由級別中介軟體繫結到router例項上,程式碼示例如下:

var app = express()
var router = express.Router()

// 路由級別的中介軟體
router.use(function(req,res,next){
    console.log('Time',Date.now())
    next()
})

app.use('/',router)

錯誤級別中介軟體

錯誤級別中介軟體的作用:專門用來捕獲整個專案中發生的異常錯誤,從而防止專案異常崩潰的問題。
格式:錯誤級別中介軟體的function處理函式中,必須有四個形參,形參從前到後,分別是(err,req,res,next)。

app.get('/',function(req,res){ // 路由
    throw new Error('伺服器內部發生了錯誤!')
    res.send('Home Page.')
})
app.use(function(err,req,res,next){
    console.log('發生了錯誤'+err.message) // 錯誤級別的中介軟體
    console.log('發生了錯誤:'+err.message) // 在伺服器列印錯誤訊息
    res.send('Error! '+ err.message) // 向客戶端響應錯誤相關的內容
})