Express 是一個(gè)基于 Node.js 的 Web 框架,中間件是 Express 中的重要概念之一。中間件可以在請(qǐng)求到達(dá)目標(biāo)路由之前或之后執(zhí)行一些操作,例如日志記錄、請(qǐng)求體解析、認(rèn)證授權(quán)等。下面是 Express 中間件的調(diào)用流程和常規(guī)操作:
調(diào)用流程
Express 中間件的調(diào)用流程是一個(gè)類(lèi)似于管道的過(guò)程,請(qǐng)求會(huì)依次經(jīng)過(guò)一個(gè)個(gè)中間件,每個(gè)中間件可以對(duì)請(qǐng)求進(jìn)行修改或攔截。當(dāng)一個(gè)中間件執(zhí)行完畢后,可以通過(guò)調(diào)用 next() 方法將請(qǐng)求傳遞給下一個(gè)中間件,如果不調(diào)用 next() 方法,則請(qǐng)求將被當(dāng)前中間件攔截。
常規(guī)操作
Express 中間件的常規(guī)操作包括以下幾個(gè)方面:
(1)編寫(xiě)中間件
中間件可以是一個(gè)函數(shù)或一個(gè)函數(shù)數(shù)組,函數(shù)接收三個(gè)參數(shù):請(qǐng)求對(duì)象(req)、響應(yīng)對(duì)象(res)和 next 函數(shù)。例如:
function logger(req, res, next) {
console.log(`${req.method} ${req.url}`);
next();
}
(2)注冊(cè)中間件
使用 app.use() 方法可以注冊(cè)中間件,例如:
app.use(logger);
可以通過(guò)傳遞路徑參數(shù)來(lái)為特定的路由注冊(cè)中間件,例如:
app.use('/api', apiMiddleware);
(3)錯(cuò)誤處理中間件
錯(cuò)誤處理中間件可以在發(fā)生錯(cuò)誤時(shí)對(duì)請(qǐng)求進(jìn)行處理,例如返回錯(cuò)誤信息或重定向到錯(cuò)誤頁(yè)面。錯(cuò)誤處理中間件接收四個(gè)參數(shù):錯(cuò)誤對(duì)象(err)、請(qǐng)求對(duì)象(req)、響應(yīng)對(duì)象(res)和 next 函數(shù)。例如:
function errorHandler(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
}
使用 app.use() 方法注冊(cè)錯(cuò)誤處理中間件,例如:
app.use(errorHandler);
除了上述常規(guī)操作外,還可以使用第三方中間件或編寫(xiě)自己的中間件庫(kù)來(lái)擴(kuò)展 Express 功能。