Express Request 與 Response:深度掌握 HTTP 請求與回應
在 Express 的路由處理函式中,你最常接觸的就是 req (Request) 和 res (Response) 這兩個物件。它們是對原生 Node.js HTTP 模組的包裝與增強,掌握它們的 API 能讓你對連線過程有更精確的掌控。
Request (req):客戶端傳來了什麼?
除了常見的 req.params 和 req.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() | 乾脆地結束回應(不帶任何數據) | 否 |
總結
req是你的情報來源,包含了瀏覽器的一切秘密。res是你的武裝,決定了用戶最終會看到什麼。- 善用 連鎖呼叫 (Method Chaining)(如
res.status(201).json(...))能讓你的程式碼更具現代感且易讀。