Express中全局中間件與局部中間件的使用
Express 是 Node.js 生態(tài)系統(tǒng)中最流行的 Web 應(yīng)用框架之一,提供了簡(jiǎn)潔的 API,便于開(kāi)發(fā)者創(chuàng)建 Web 應(yīng)用程序和 RESTful API。本文將詳細(xì)介紹 Express 中的全局中間件與局部中間件,幫助開(kāi)發(fā)者更好地理解兩者的區(qū)別、用法以及在實(shí)際項(xiàng)目中的應(yīng)用場(chǎng)景。
一、Express 中的中間件概述
1. 什么是中間件?
中間件(middleware)是 Express 應(yīng)用程序中處理請(qǐng)求的函數(shù),通常用于處理 HTTP 請(qǐng)求和響應(yīng)的過(guò)程。中間件可以訪問(wèn)請(qǐng)求對(duì)象(req
)、響應(yīng)對(duì)象(res
)以及應(yīng)用程序的下一個(gè)中間件函數(shù)。其主要作用是處理請(qǐng)求數(shù)據(jù)、進(jìn)行身份驗(yàn)證、記錄日志、處理錯(cuò)誤等。
中間件可以通過(guò)以下三種方式應(yīng)用:
- 全局中間件:在應(yīng)用程序中全局生效,所有請(qǐng)求都會(huì)經(jīng)過(guò)該中間件。
- 局部中間件:只作用于特定的路由或請(qǐng)求。
- 錯(cuò)誤處理中間件:專(zhuān)門(mén)用于捕獲和處理錯(cuò)誤。
2. Express 中的中間件執(zhí)行順序
在 Express 中,中間件是按照定義的順序依次執(zhí)行的。當(dāng)一個(gè)中間件處理完畢后,可以通過(guò)調(diào)用 next()
函數(shù)將控制權(quán)傳遞給下一個(gè)中間件。如果不調(diào)用 next()
,則請(qǐng)求將會(huì)掛起,后續(xù)的中間件或路由不會(huì)被執(zhí)行。
二、全局中間件的作用與用法
1. 什么是全局中間件?
全局中間件是指在應(yīng)用程序啟動(dòng)時(shí)注冊(cè)的中間件,這些中間件對(duì)所有路由和請(qǐng)求生效。通常用于一些通用的處理邏輯,比如解析請(qǐng)求體、處理靜態(tài)文件、添加全局響應(yīng)頭等。
2. 常見(jiàn)的全局中間件示例
以下是一些常用的全局中間件示例:
(1) 解析 JSON 請(qǐng)求體的中間件
Express 內(nèi)置了 express.json()
中間件,用于解析請(qǐng)求體中的 JSON 數(shù)據(jù):
const express = require('express'); const app = express(); // 全局解析 JSON 請(qǐng)求體 app.use(express.json()); app.post('/data', (req, res) => { res.send(req.body); // 輸出解析后的 JSON 數(shù)據(jù) }); app.listen(3000, () => { console.log('Server running on port 3000'); });
(2) 日志記錄中間件
開(kāi)發(fā)者可以使用第三方中間件如 morgan
來(lái)記錄 HTTP 請(qǐng)求日志:
const express = require('express'); const morgan = require('morgan'); const app = express(); // 全局日志記錄中間件 app.use(morgan('combined')); app.get('/', (req, res) => { res.send('Hello World'); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
(3) 靜態(tài)文件處理中間件
使用 express.static()
處理靜態(tài)文件請(qǐng)求:
const express = require('express'); const app = express(); // 全局處理靜態(tài)文件 app.use(express.static('public')); app.listen(3000, () => { console.log('Server running on port 3000'); });
在這個(gè)例子中,public
目錄下的文件可以通過(guò) /
直接訪問(wèn),例如 public/index.html
可以通過(guò) http://localhost:3000/index.html
訪問(wèn)。
3. 全局中間件的使用場(chǎng)景
全局中間件通常用于以下場(chǎng)景:
- 請(qǐng)求解析:如解析 JSON、URL 編碼的數(shù)據(jù)等。
- 身份驗(yàn)證:對(duì)所有路由進(jìn)行身份驗(yàn)證或權(quán)限校驗(yàn)。
- 請(qǐng)求日志:記錄所有請(qǐng)求的詳細(xì)信息。
- 錯(cuò)誤處理:全局捕獲應(yīng)用程序中的錯(cuò)誤。
三、局部中間件的作用與用法
1. 什么是局部中間件?
局部中間件是指僅在特定路由或一組路由中生效的中間件。這種中間件只會(huì)在匹配到特定路由時(shí)執(zhí)行,適用于那些只針對(duì)部分路由進(jìn)行的處理邏輯。
2. 局部中間件的定義與使用
局部中間件的定義通常是在路由處理函數(shù)之前,作為參數(shù)傳遞給路由。以下是一個(gè)簡(jiǎn)單的示例:
const express = require('express'); const app = express(); // 局部中間件函數(shù) const checkAuth = (req, res, next) => { const auth = req.headers.authorization; if (auth === 'secret-token') { next(); // 如果驗(yàn)證通過(guò),繼續(xù)處理下一個(gè)中間件或路由 } else { res.status(403).send('Forbidden'); // 否則返回 403 } }; // 在特定路由中使用局部中間件 app.get('/protected', checkAuth, (req, res) => { res.send('This is a protected route'); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
在這個(gè)例子中,checkAuth
中間件只對(duì) /protected
路由生效,用于驗(yàn)證請(qǐng)求頭中的 authorization
是否匹配。
3. 多個(gè)局部中間件的使用
Express 支持在單個(gè)路由中使用多個(gè)局部中間件??梢酝ㄟ^(guò)鏈?zhǔn)秸{(diào)用來(lái)實(shí)現(xiàn)這一點(diǎn):
const express = require('express'); const app = express(); const middleware1 = (req, res, next) => { console.log('Middleware 1'); next(); }; const middleware2 = (req, res, next) => { console.log('Middleware 2'); next(); }; app.get('/example', middleware1, middleware2, (req, res) => { res.send('Hello from /example route'); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
在 /example
路由中,middleware1
和 middleware2
都會(huì)按順序執(zhí)行,然后再由路由處理函數(shù)發(fā)送響應(yīng)。
4. 局部中間件的使用場(chǎng)景
局部中間件通常用于以下場(chǎng)景:
- 特定路由的權(quán)限驗(yàn)證:如用戶權(quán)限驗(yàn)證或 API Key 驗(yàn)證。
- 特定請(qǐng)求的預(yù)處理:如為某些路由添加自定義的請(qǐng)求頭或參數(shù)。
- 路由日志記錄:只記錄某些敏感路由的請(qǐng)求日志。
四、全局中間件與局部中間件的區(qū)別
全局中間件與局部中間件的主要區(qū)別在于它們的作用范圍:
特性 | 全局中間件 | 局部中間件 |
---|---|---|
作用范圍 | 對(duì)所有請(qǐng)求生效 | 只對(duì)特定路由或請(qǐng)求生效 |
典型用途 | 解析請(qǐng)求體、處理靜態(tài)文件、身份驗(yàn)證等 | 權(quán)限驗(yàn)證、參數(shù)處理、日志記錄等 |
執(zhí)行順序 | 按照在應(yīng)用程序中注冊(cè)的順序執(zhí)行 | 按照在路由中定義的順序執(zhí)行 |
應(yīng)用場(chǎng)景 | 通用功能,如請(qǐng)求解析、錯(cuò)誤處理等 | 特定場(chǎng)景,如單一路由的權(quán)限驗(yàn)證等 |
五、總結(jié)
在 Express 應(yīng)用程序中,全局中間件與局部中間件各有用途。全局中間件用于處理那些適用于整個(gè)應(yīng)用程序的通用邏輯,如請(qǐng)求體解析、日志記錄等。而局部中間件則可以在特定路由中應(yīng)用,提供更精細(xì)化的控制,如路由權(quán)限驗(yàn)證或請(qǐng)求預(yù)處理。
到此這篇關(guān)于Express中全局中間件與局部中間件的使用的文章就介紹到這了,更多相關(guān)Express 全局中間件與局部中間件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node+axios實(shí)現(xiàn)服務(wù)端文件上傳示例
這篇文章主要介紹了node+axios實(shí)現(xiàn)服務(wù)端文件上傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Node.js的MongoDB驅(qū)動(dòng)Mongoose基本使用教程
這篇文章主要介紹了Node.js的MongoDB驅(qū)動(dòng)Mongoose的基本使用教程,前端js+后端Node.js+數(shù)據(jù)庫(kù)MongoDB是當(dāng)下流行的JavaScript全棧開(kāi)發(fā)方案,需要的朋友可以參考下2016-03-03node以及npm版本不對(duì)應(yīng)出錯(cuò)的完美解決方法
最近項(xiàng)目用到了node和npm,查看一下當(dāng)前版本,發(fā)現(xiàn)有報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于node以及npm版本不對(duì)應(yīng)出錯(cuò)的完美解決方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05基于node.js的fs核心模塊讀寫(xiě)文件操作(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇基于node.js的fs核心模塊讀寫(xiě)文件操作(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就想給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Node.js實(shí)現(xiàn)注冊(cè)郵箱激活功能的方法示例
現(xiàn)在很多網(wǎng)站都需要有注冊(cè)郵箱激活的功能,本篇文章主要介紹了Node.js實(shí)現(xiàn)注冊(cè)郵箱激活功能的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03