接下來要了解 Express 中的中介軟體 (Middleware) 概念,並學習如何在應用程式中使用中介軟體來處理請求與回應。
中介軟體是 Express 中非常強大的功能,它是一種可以在處理請求與回應的過程中插入的函數。每一個中介軟體都能夠訪問請求 (request) 物件、回應 (response) 物件,並可以決定是否將控制權交給下一個中介軟體。
中介軟體函數有三個參數:
js
app.use((req, res, next) => {
console.log('Request received');
next();
});
這個程式碼代表要傳遞控制權給下一個中介軟體。
Express 中介軟體可以分為:
應用級中介軟體會對所有的路由和請求生效,而且可以在應用程式的任意部分插入。
應用級中介軟體的範例:
js
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log('Time:', Date.now());
next();
});
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
在這裡,每次收到請求時,應用級中介軟體會先被執行,也就是先印出當前的時間,然後將控制權交給下一個處理函數。
路由級中介軟體是只針對特定路由的中介軟體,常用來處理特定路由的邏輯,如身份驗證、資料處理等。
路由級中介軟體的範例:
js
const express = require('express');
const app = express();
app.use('/user', (req, res, next) => {
console.log('Request Type:', req.method);
next();
});
app.get('/user', (req, res) => {
res.send('User Page');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000');
});
這個中介軟體只會在訪問 /user 路由時執行。
Express 提供了許多內建中介軟體來處理常見的功能。像是可以使用 express.json() 來自動解析 JSON 格式的請求主體。
解析 JSON 請求主體的範例:
js
app.use(express.json());
app.post('/data', (req, res) => {
res.send(`Received JSON data: ${JSON.stringify(req.body)}`);
});
在這裡,express.json() 會解析請求主體中的 JSON 數據並將其放在 req.body 中。
除了上面的軟體,還可以使用外部庫作為中介軟體來擴展應用的功能。像是可以使用 morgan 來進行日誌記錄。
使用第三方中介軟體 morgan 的範例:
bash
npm install morgan
js
const morgan = require('morgan');
app.use(morgan('dev'));
app.get('/', (req, res) => {
res.send('Logging requests using Morgan!');
});
這裡 morgan 會自動記錄每一個請求的詳細資料,對於日誌記錄非常方便。
中介軟體會按照定義的順序依次執行,所以說順序很重要。如果某個中介軟體沒有調用 next(),後面的中介軟體就不會被執行。
控制執行順序的範例:
js
app.use((req, res, next) => {
console.log('First Middleware');
next();
});
app.use((req, res, next) => {
console.log('Second Middleware');
res.send('Response from second middleware');
});
在這個範例中,First Middleware 會先執行,然後才是 Second Middleware,而且 Second Middleware 直接發送了回應,所以後面的中介軟體不會被執行。
錯誤處理中介軟體是用來處理應用程式中的錯誤的。這類中介軟體有四個參數:err, req, res, next。
錯誤處理中介軟體的範例:
js
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
這個範例顯示了如何捕捉應用中的錯誤,並返回 500 錯誤碼。
今天學習了 Express 中介軟體的基本概念,了解了如何使用應用級、路由級、內建和第三方中介軟體來處理請求。中介軟體提供了多樣化的方式來處理應用程式的各種功能,這種方式能廣泛使用於 Express 應用開發中。接下來將深入探索更高階的 Express 功能與實際應用。