iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
自我挑戰組

利用 node.js/express 架設網站系列 第 12

Day-12 中介軟體與錯誤處理

  • 分享至 

  • xImage
  •  

今天會延續之前有提到的中介軟體,一樣有三個重點:
1.理解中介軟體的概念
2.使用內建與第三方中介軟體
3.錯誤處理與自定義錯誤中介軟體

理解中介軟體的概念

中介軟體(Middleware) 是 Express 中的一個核心概念,它是執行請求-響應循環中的一個函數。中介軟體函數可以訪問請求對象(req)、響應對象(res)和應用的下一個中介軟體函數(next)。

  • 中介軟體結構:
app.use((req, res, next) => {
    console.log('This is a middleware');
    next(); // 調用 next() 讓請求繼續前往下一個中介軟體或路由
});

中介軟體主要分為以下幾種類型:

  • 應用級中介軟體
  • 路由級中介軟體
  • 內建中介軟體
  • 第三方中介軟體

內建中介軟體

Express 提供了一些內建中介軟體來簡化常見任務的處理,如解析 JSON 請求和 URL 編碼數據。
使用 express.json() 來解析 JSON 請求:

app.use(express.json()); // 解析應用程序中的 JSON 數據

使用 express.urlencoded() 來處理 URL 編碼的請求數據:

app.use(express.urlencoded({ extended: true })); // 解析表單提交的數據

第三方中介軟體

還可以使用許多第三方中介軟體來添加特定功能。
使用 cors 來處理跨域請求:

npm install cors
const cors = require('cors');
app.use(cors()); // 允許所有來源的跨域請求

使用 morgan 來記錄請求日誌:

npm install morgan
const morgan = require('morgan');
app.use(morgan('dev')); // 使用 'dev' 格式來顯示簡潔的日誌

編寫自定義中介軟體

除了使用內建和第三方中介軟體,你還可以編寫自己的中介軟體來執行特定的業務邏輯。
範例:

app.use((req, res, next) => {
    req.requestTime = Date.now();
    console.log(`Request received at: ${req.requestTime}`);
    next(); // 確保繼續執行下一個中介軟體
});

這段中介軟體會在每個請求中記錄請求的時間,並將 requestTime 屬性附加到 req 對象上。

錯誤處理

為了統一處理應用中的錯誤,你可以定義一個全局的錯誤處理中介軟體。
範例:

app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).json({ message: 'Something went wrong!', error: err.message });
});

這段代碼會捕捉應用中的所有錯誤,記錄錯誤堆疊信息,並返回一個標準的錯誤響應。

  • 手動觸發錯誤
    在某些情況下,你可能需要手動觸發錯誤。例如,在驗證用戶輸入時,如果檢測到不正確的數據,可以使用 next(err) 來傳遞錯誤。
    範例:
app.get('/error-test', (req, res, next) => {
    const error = new Error('This is a test error');
    next(error); // 傳遞錯誤到錯誤處理中介軟體
});

錯誤處理的最佳實踐

  • 不要在生產環境中顯示詳細錯誤堆疊:在生產環境中,不應該將詳細的錯誤信息暴露給用戶,而應該返回通用的錯誤消息。
  • 區分不同類型的錯誤:你可以根據錯誤的類型設置不同的錯誤處理邏輯,如 404 錯誤(資源未找到)與 500 錯誤(內部服務器錯誤)。
  • 驗證輸入數據:為了防止錯誤的數據進入系統,應該對用戶輸入進行驗證,並在檢測到無效數據時立即返回錯誤。

上一篇
Day-11 文件上傳與處理
下一篇
Day-13 模版引擎與視圖渲染
系列文
利用 node.js/express 架設網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言