Express Request 與 Response:深度掌握 HTTP 請求與回應

在 Express 的路由處理函式中,你最常接觸的就是 req (Request) 和 res (Response) 這兩個物件。它們是對原生 Node.js HTTP 模組的包裝與增強,掌握它們的 API 能讓你對連線過程有更精確的掌控。

Request (req):客戶端傳來了什麼?

除了常見的 req.paramsreq.query,以下是進階開發必備的核心欄位:

  • req.body:獲取請求的主體內容(需搭配 Body-parser 中間件)。
  • req.get(header):不分大小寫獲取請求頭。例如:req.get('Content-Type')
  • req.ip:獲取連線者的 IP 地址。
  • req.xhr:如果是 AJAX (XMLHttpRequest) 請求,此值為 true
  • req.secure:若當前是 HTTPS 連線,則為 true
  • req.originalUrl:獲取完整的原始請求路徑。

Response (res):我要回傳什麼?

res 物件提供了極其豐富的方法來處理各種類型的回應。

1. 設定狀態碼與回應

// 鏈式呼叫:設定 404 狀態碼並傳送訊息
res.status(404).send('Sorry, we cannot find that!');

2. 資料傳輸與 JSON

// 自動設定 Content-Type 為 application/json
res.json({ status: 'success', data: { id: 101 } });

3. 重新導向 (Redirect)

// 將用戶導向新的頁面
res.redirect('/new-page');
// 也可以指定 301 永久轉址
res.redirect(301, 'https://example.com');

4. 檔案管理 (Download & Proxy)

  • res.download(path):彈出下載視窗。
  • res.sendFile(path):在瀏覽器內直接預覽檔案(如圖片或 PDF)。
app.get('/invoice', (req, res) => {
  res.download('./files/receipt.pdf', '2025_收據.pdf');
});

5. 即時資料儲存:res.locals

這是 Express 最好用的特性之一。它讓你在處理請求的過程中暫存資料,並讓後續的中間件或模板引擎 (Template Engine) 使用。

app.use((req, res, next) => {
  res.locals.user = { name: 'Mike' }; // 全域可用
  next();
});

常用 Response API 速查表

方法用途自動設定 Header
res.send()發送 HTML, 字串或 Buffer
res.json()發送 JSON 物件是 (Content-Type)
res.status()僅設定 HTTP 狀態碼
res.sendStatus()設定狀態碼並發送對應的文字
res.redirect()執行 URL 重定向是 (301/302)
res.end()乾脆地結束回應(不帶任何數據)

總結

  1. req 是你的情報來源,包含了瀏覽器的一切秘密。
  2. res 是你的武裝,決定了用戶最終會看到什麼。
  3. 善用 連鎖呼叫 (Method Chaining)(如 res.status(201).json(...))能讓你的程式碼更具現代感且易讀。