Express 中間件能夠處理請求驗證、錯誤處理、日誌記錄等問題,簡化複雜的開發流程,無論你是正在構建企業級應用還是簡單的網站,掌握中間件的使用都能顯著提升你的開發效率和應用質量。
中間件是一個函數,它可以存取請求對象(request object,req
)、回應對象(response object,res
),以及應用程式的請求-回應循環中的下一個中間件函數,通常由變數 next
表示。
中間件在 Express 應用中可以執行以下任務:
如果當前中間件沒有終止請求-回應循環,它必須呼叫 next()
將控制權傳遞給下一個中間件,否則請求將被掛起。
一個典型的中間件函數看起來是這樣的:
function myMiddleware(req, res, next) {
// 執行某些操作
console.log('這是一個中間件');
// 呼叫下一個中間件
next();
}
Express 提供了一些內建的中間件,可以直接使用來處理常見任務。以下是幾個最常用的:
這個中間件用於解析 JSON 格式的請求體。當客戶端傳送 JSON 數據時,express.json()
會自動將其解析並放入 req.body
中。
const express = require('express');
const app = express();
const port = 3000;
app.post('/api/data', (req, res) => {
console.log(req.body); // 存取已解析的表單數據
res.json({ message: '數據已接收' });
});
app.listen(port, () => {
console.log(`服務器運行在 http://localhost:${port}`);
});
這個中間件用於解析 URL-encoded 格式的請求體,通常用於處理 HTML 表單提交的數據。
const express = require('express');
const app = express();
const port = 3000;
app.use(express.urlencoded({ extended: true }));
app.post('/submit-form', (req, res) => {
console.log(req.body); // 存取已解析的表單數據
res.send('表單已提交');
});
app.get('/', (req, res) => {
res.send(`
<html>
<body>
<h1>表單提交示例</h1>
<form action="/submit-form" method="POST">
<label for="name">姓名:</label>
<input type="text" id="name" name="name"><br><br>
<label for="email">郵箱:</label>
<input type="email" id="email" name="email"><br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
`);
});
app.listen(port, () => {
console.log(`服務器運行在 http://localhost:${port}`);
});
express.static
中間件用於提供靜態文件,如 HTML、CSS、JavaScript、圖片等。
app.use(express.static('public'));
這行程式碼將使 public
目錄下的文件可以直接通過 URL 存取。例如,如果 public
目錄下有一個 styles.css
文件,可以通過 http://localhost:3000/styles.css
存取。
除了使用內建中間件,你還可以創建自定義中間件來滿足特定需求。以下是一些常見的自定義中間件示例:
這個中間件可以用來記錄每個請求的詳細信息:
function loggerMiddleware(req, res, next) {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next();
}
app.use(loggerMiddleware);
錯誤處理中間件通常定義為四個參數的函數,用於集中處理應用程式中的錯誤:
// 模擬數據庫操作
function fetchUserFromDatabase(id) {
// 假設 ID 為 0 時,模擬數據庫錯誤
if (id === '0') {
throw new Error('數據庫連接失敗');
}
return { id, name: 'User ' + id };
}
// 用戶資料路由
app.get('/user/:id', (req, res, next) => {
try {
const user = fetchUserFromDatabase(req.params.id);
res.json(user);
} catch (error) {
next(error); // 將錯誤傳遞給錯誤處理中間件
}
});
// 錯誤處理中間件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: '伺服器錯誤,請稍後再試' });
});
用於檢查用戶是否已登入的中間件:
function authMiddleware(req, res, next) {
if (req.session && req.session.user) {
next();
} else {
res.status(401).send('請先登入');
}
}
// 在需要驗證的路由上使用
app.get('/protected', authMiddleware, (req, res) => {
res.send('這是受保護的內容');
});
通過合理使用內建中間件和自定義中間件,你可以輕鬆處理複雜的業務邏輯、提升應用程式的安全性,並實現各種功能擴展。記住,中間件的順序很重要,合理安排它們可以讓你的應用程式的可維護性提高。