Express中全局中間件與局部中間件的使用
Express 是 Node.js 生態(tài)系統(tǒng)中最流行的 Web 應用框架之一,提供了簡潔的 API,便于開發(fā)者創(chuàng)建 Web 應用程序和 RESTful API。本文將詳細介紹 Express 中的全局中間件與局部中間件,幫助開發(fā)者更好地理解兩者的區(qū)別、用法以及在實際項目中的應用場景。
一、Express 中的中間件概述
1. 什么是中間件?
中間件(middleware)是 Express 應用程序中處理請求的函數(shù),通常用于處理 HTTP 請求和響應的過程。中間件可以訪問請求對象(req)、響應對象(res)以及應用程序的下一個中間件函數(shù)。其主要作用是處理請求數(shù)據(jù)、進行身份驗證、記錄日志、處理錯誤等。
中間件可以通過以下三種方式應用:
- 全局中間件:在應用程序中全局生效,所有請求都會經(jīng)過該中間件。
- 局部中間件:只作用于特定的路由或請求。
- 錯誤處理中間件:專門用于捕獲和處理錯誤。
2. Express 中的中間件執(zhí)行順序
在 Express 中,中間件是按照定義的順序依次執(zhí)行的。當一個中間件處理完畢后,可以通過調(diào)用 next() 函數(shù)將控制權傳遞給下一個中間件。如果不調(diào)用 next(),則請求將會掛起,后續(xù)的中間件或路由不會被執(zhí)行。
二、全局中間件的作用與用法
1. 什么是全局中間件?
全局中間件是指在應用程序啟動時注冊的中間件,這些中間件對所有路由和請求生效。通常用于一些通用的處理邏輯,比如解析請求體、處理靜態(tài)文件、添加全局響應頭等。
2. 常見的全局中間件示例
以下是一些常用的全局中間件示例:
(1) 解析 JSON 請求體的中間件
Express 內(nèi)置了 express.json() 中間件,用于解析請求體中的 JSON 數(shù)據(jù):
const express = require('express');
const app = express();
// 全局解析 JSON 請求體
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) 日志記錄中間件
開發(fā)者可以使用第三方中間件如 morgan 來記錄 HTTP 請求日志:
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)文件請求:
const express = require('express');
const app = express();
// 全局處理靜態(tài)文件
app.use(express.static('public'));
app.listen(3000, () => {
console.log('Server running on port 3000');
});
在這個例子中,public 目錄下的文件可以通過 / 直接訪問,例如 public/index.html 可以通過 http://localhost:3000/index.html 訪問。
3. 全局中間件的使用場景
全局中間件通常用于以下場景:
- 請求解析:如解析 JSON、URL 編碼的數(shù)據(jù)等。
- 身份驗證:對所有路由進行身份驗證或權限校驗。
- 請求日志:記錄所有請求的詳細信息。
- 錯誤處理:全局捕獲應用程序中的錯誤。
三、局部中間件的作用與用法
1. 什么是局部中間件?
局部中間件是指僅在特定路由或一組路由中生效的中間件。這種中間件只會在匹配到特定路由時執(zhí)行,適用于那些只針對部分路由進行的處理邏輯。
2. 局部中間件的定義與使用
局部中間件的定義通常是在路由處理函數(shù)之前,作為參數(shù)傳遞給路由。以下是一個簡單的示例:
const express = require('express');
const app = express();
// 局部中間件函數(shù)
const checkAuth = (req, res, next) => {
const auth = req.headers.authorization;
if (auth === 'secret-token') {
next(); // 如果驗證通過,繼續(xù)處理下一個中間件或路由
} 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');
});
在這個例子中,checkAuth 中間件只對 /protected 路由生效,用于驗證請求頭中的 authorization 是否匹配。
3. 多個局部中間件的使用
Express 支持在單個路由中使用多個局部中間件??梢酝ㄟ^鏈式調(diào)用來實現(xià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 都會按順序執(zhí)行,然后再由路由處理函數(shù)發(fā)送響應。
4. 局部中間件的使用場景
局部中間件通常用于以下場景:
- 特定路由的權限驗證:如用戶權限驗證或 API Key 驗證。
- 特定請求的預處理:如為某些路由添加自定義的請求頭或參數(shù)。
- 路由日志記錄:只記錄某些敏感路由的請求日志。
四、全局中間件與局部中間件的區(qū)別
全局中間件與局部中間件的主要區(qū)別在于它們的作用范圍:
| 特性 | 全局中間件 | 局部中間件 |
|---|---|---|
| 作用范圍 | 對所有請求生效 | 只對特定路由或請求生效 |
| 典型用途 | 解析請求體、處理靜態(tài)文件、身份驗證等 | 權限驗證、參數(shù)處理、日志記錄等 |
| 執(zhí)行順序 | 按照在應用程序中注冊的順序執(zhí)行 | 按照在路由中定義的順序執(zhí)行 |
| 應用場景 | 通用功能,如請求解析、錯誤處理等 | 特定場景,如單一路由的權限驗證等 |
五、總結
在 Express 應用程序中,全局中間件與局部中間件各有用途。全局中間件用于處理那些適用于整個應用程序的通用邏輯,如請求體解析、日志記錄等。而局部中間件則可以在特定路由中應用,提供更精細化的控制,如路由權限驗證或請求預處理。
到此這篇關于Express中全局中間件與局部中間件的使用的文章就介紹到這了,更多相關Express 全局中間件與局部中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Node.js的MongoDB驅動Mongoose基本使用教程
這篇文章主要介紹了Node.js的MongoDB驅動Mongoose的基本使用教程,前端js+后端Node.js+數(shù)據(jù)庫MongoDB是當下流行的JavaScript全棧開發(fā)方案,需要的朋友可以參考下2016-03-03

