在前面幾天的實作中,我們的 API 逐漸成形:
在 Express 中,Middleware 本質上就是一個函式,會在「請求(Request)」與「回應(Response)」之間運行。
結構大概是這樣:
function middleware(req, res, next) {
console.log('Middleware triggered');
next(); // 繼續執行下一個 middleware 或 route handler
}
我們希望每次 API 請求時,能在 console 中顯示時間、方法與路徑。
// middleware/logger.js
function logger(req, res, next) {
const now = new Date().toISOString();
console.log(`[${now}] ${req.method} ${req.originalUrl}`);
next(); // 繼續下一步
}
module.exports = logger;
在 app.js 中使用:
const express = require('express');
const app = express();
const logger = require('./middleware/logger');
app.use(logger); // 所有請求都會經過 logger
我們之前在路由中用 try/catch 捕捉錯誤,但這樣每個路由都要重複寫。
我們可以改用統一的錯誤處理 Middleware。
// middleware/errorHandler.js
function errorHandler(err, req, res, next) {
console.error(err.stack);
res.status(err.status || 500).json({
error: err.message || 'Server Error'
});
}
module.exports = errorHandler;
在 app.js 中使用:
const errorHandler = require('./middleware/errorHandler');
// 放在所有路由的最後
app.use(errorHandler);
我們可以建立一個簡單的 Middleware,檢查請求 Header 是否有帶 x-api-key。
// middleware/auth.js
function auth(req, res, next) {
const apiKey = req.headers['x-api-key'];
if (apiKey === 'my-secret-key') {
next(); // 驗證成功,繼續
} else {
res.status(401).json({ error: 'Unauthorized' });
}
}
module.exports = auth;
在路由中使用:
const auth = require('../middleware/auth');
router.get('/secure', auth, (req, res) => {
res.json({ message: 'You accessed a protected route!' });
});
今天我們學到了 Middleware(中介層) 的概念與應用: