昨天我們完成了「新訂單通知」,店家能即時收到顧客下單提醒。
但訂單不是單純存起來就結束,還需要隨著處理流程而變化。
例如:等待處理(Pending)、製作中(In Progress)、完成(Completed)。
今天我們要在系統中加入訂單狀態管理,讓店家能透過 API 更新訂單進度,並在資料庫中維護清楚的狀態紀錄,為之後的通知與查詢功能打下基礎。
顧客下單後 → 預設是 Pending
。
店家開始處理 → 改為 In Progress
。
訂單完成 → 更新為 Completed
。
沒有狀態管理,訂單只是死資料,無法反映真實流程。
在 Day 8 定義的 OrderSchema
已包含狀態欄位:
status: {
type: String,
enum: ['Pending', 'In Progress', 'Completed'],
default: 'Pending',
index: true
}
這樣設計的好處:
有效避免錯誤值(例如 "Done"、"Finish")被寫進資料庫。
支援索引,方便快速查詢特定狀態的訂單。
Endpoint:PATCH /orders/:id/status
Request body:{ status: 'In Progress' }
功能:更新指定訂單的狀態。
驗證:輸入值必須符合 enum 定義。
// routes/orders.js
// 更新訂單狀態
router.patch("/:id/status", async (req, res) => {
try {
const { status } = req.body;
const validStatus = ["Pending", "In Progress", "Completed"];
if (!validStatus.includes(status)) {
return res.status(400).json({ success: false, message: "無效的狀態值" });
}
const order = await Order.findByIdAndUpdate(
req.params.id,
{ status },
{ new: true } // 回傳更新後的資料
);
if (!order) {
return res.status(404).json({ success: false, message: "找不到訂單" });
}
res.json({ success: true, order });
} catch (err) {
console.error(err);
res.status(500).json({ success: false, message: "更新訂單狀態失敗" });
}
});
大家可以選擇自己熟悉的工具來發 Request,我的範例還是會以 Postman 為主。
首先可以先至 MongoDB Compass 選擇一筆前幾天我們從 Line 建立的訂單,並將其 "_id" 填入 endpoint 的 ":id" 位置。
再來發 PATCH request 前,記得要將 Body 填上去,填入要變更成的訂單狀態。
發出 Request 後,更新 MongoDB Compass 的介面,就可以發現剛剛所填的訂單已經更改為我們在 request body 所填入的狀態了!
今天我們專注在「後端狀態管理」。明天(Day 14)將進一步實作「顧客查詢訂單狀態」,並在狀態變更時推播通知,讓顧客能即時追蹤訂單進度。
訂單管理的核心在於「狀態」,能反映現實流程。
API 設計需嚴格驗證,避免寫入無效狀態。
狀態管理是通知與查詢的基礎,讓訂單「會呼吸」。