iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
自我挑戰組

30 天 Node.js 探索:基礎、進階與實踐系列 第 9

Day 9: Middleware 中介軟體的概念與使用

  • 分享至 

  • xImage
  •  

接下來要了解 Express 中的中介軟體 (Middleware) 概念,並學習如何在應用程式中使用中介軟體來處理請求與回應。

什麼是中介軟體 (Middleware)?

中介軟體是 Express 中非常強大的功能,它是一種可以在處理請求與回應的過程中插入的函數。每一個中介軟體都能夠訪問請求 (request) 物件、回應 (response) 物件,並可以決定是否將控制權交給下一個中介軟體。
中介軟體函數有三個參數:

  • req :請求物件,包含請求的詳細資料。
  • res :回應物件,用於發送回應給客戶端。
  • next :函數,用於將控制權交給下一個中介軟體。
    簡單的中介軟體結構的範例:
js
app.use((req, res, next) => {
  console.log('Request received');
  next();
});

這個程式碼代表要傳遞控制權給下一個中介軟體。

Express 中介軟體的類型

Express 中介軟體可以分為:

  • ** 應用級中介軟體:** 對整個應用程式起作用。
  • ** 路由級中介軟體:** 僅對特定路由起作用。
  • ** 內建中介軟體:** Express 內建的一些常用功能,例如處理靜態文件、解析 JSON。
  • ** 第三方中介軟體:** 可以安裝並使用的外部庫。

應用級中介軟體

應用級中介軟體會對所有的路由和請求生效,而且可以在應用程式的任意部分插入。
應用級中介軟體的範例:

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 提供了許多內建中介軟體來處理常見的功能。像是可以使用 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 功能與實際應用。


上一篇
Day 8: 路由與請求處理:Express 框架基礎
下一篇
Day 10: Node.js 單執行緒模型與非阻塞 I/O
系列文
30 天 Node.js 探索:基礎、進階與實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言