疑難排解
從現象定位至設定、資料和執行階段,排查本機開發、驗證、付款、背景工作與部署問題。
遇到問題時,先確認「哪一步尚未完成」,再決定要修改什麼。本章依目前預設範本的實際流程分為六篇,將同一業務流程中的問題放在一起,避免在驗證、電子郵件、OAuth,或付款、Webhook 之間反覆切換。
從現象找到文章
| 現象 | 閱讀文章 | 檢查重點 |
|---|---|---|
| 安裝失敗、啟動失敗、建置失敗、內容未更新 | 本機開發與建置 | Node.js、初始化、設定驗證、內容產生 |
| 缺少資料表、查不到資料、遷移失敗、約束衝突 | 資料庫與遷移 | 目標資料庫、既有結構、遷移紀錄 |
| 登入重新導向、驗證碼、電子郵件、Google 或 GitHub 登入失敗 | 登入、電子郵件與 OAuth | Cookie、驗證狀態、寄信模式、回呼設定 |
| Checkout 失敗、已付款卻未開通、Webhook 發生錯誤 | 付款與 Webhook | Stripe 連線、事件帳本、交易、權益授予 |
| Queue 有訊息卻沒有結果、週期工作未執行、統計沒有資料 | 背景工作與統計 | 取用者分派、Event、Command、Cron |
| 首次部署中斷、資源不存在、網域異常、線上仍是舊內容 | 部署、資源與網域 | 發布階段、資源歸屬、執行設定、內容同步 |
一、先固定重現條件
記錄執行環境、程式碼版本、存取網址、操作時間和最短重現步驟。例如,「正式環境,使用一般帳號購買 yearly 方案,Stripe 已完成付款,重新整理產品頁後仍無法使用」,比「付款壞了」更容易定位問題。
本機和正式環境應分別觀察。不要因為本機 D1 中沒有紀錄,就推斷正式環境的付款尚未寫入資料庫,也不要在本機修改 .env 後,直接驗證線上行為。
| 證據 | 取得位置 | 用途 |
|---|---|---|
| 請求方法、路徑、HTTP 狀態和回應本文 | 瀏覽器 Network | 區分前端未送出請求、介面拒絕請求和伺服器端例外 |
| 第一個例外、請求時間、關聯 ID | 本機終端機、Worker 記錄 | 找出失敗步驟,關聯後續處理 |
| Event ID、Checkout ID、內部執行 ID | 付款平台和應用程式記錄 | 追蹤同一筆業務,不憑時間接近就推測是同一筆 |
| 設定項目名稱、資源名稱和 ID | config/、wrangler.jsonc | 確認目前應用程式使用的目標 |
| 資料表結構、狀態和紀錄時間 | 對應 D1 的唯讀查詢 | 判斷哪些步驟的結果已儲存 |
API 的 code 有時是數值結果碼,有時屬於第三方協定,也可能不存在。數值碼可在 src/errors.ts 中查詢,不能將所有回應都視為完整的 APIResponse<T>。
分享排錯資訊時,請隱藏 Cookie、Token、金鑰、驗證碼和收件人資訊。本機郵件預覽會包含郵件內文,複製終端機輸出前也要檢查。
二、先看診斷結果,再看業務結果
在初始化後的專案根目錄,依環境選擇一個檢查指令:
# 本機設定
npm run doctor# 正式環境設定與 Cloudflare 帳戶可用性
npm run doctor:remotedoctor 會檢查設定、變數、Binding 名稱和資料庫目錄等項目。doctor:remote 會讀取 .env.production,也會檢查是否已填入遠端資源 ID,以及目前身分能否存取設定中的帳戶。
它們並不是完整的線上探測工具。檢查通過不代表每個資源都確實存在,也不代表 Resend 已投遞郵件、Stripe 已完成回呼,或 Queue 已執行工作。未啟用的選用服務可能顯示提示或警告,應依目前要驗證的功能判斷。
三、從最後一個成功步驟繼續查
典型的付款流程如下:
建立 Checkout → 使用者付款 → Webhook 簽章驗證
→ 更新付款紀錄 → 建立業務 Event → 執行 Command → 使用者取得存取能力如果已收到正確的付款事件,就繼續查看付款紀錄和權限處理,不需要反覆修改 Checkout 頁面。如果尚未收到回呼,則先解決回呼網址、Secret 和投遞問題。
背景工作也是如此。queue.send() 完成、訊息已確認、Command 成功,以及外部服務最終完成,是不同階段,應分別驗證。
四、修正後如何確認
使用同一個重現案例重新驗證,並檢查相關的失敗情境。例如,修正方案對應關係後,除了確認新付款能否開通,也要確認重複回呼不會重複授予權益。
修改程式碼後,執行專案的 npm run verify。變更設定或服務供應商設定後,還要實際驗證對應業務,編譯通過不能證明外部服務可用。
保留故障證據
請勿為了消除錯誤而重設正式環境資料庫、刪除付款事件紀錄或更換 SAAS_SECRET。先確認故障發生的位置,再選擇恢復方式。重設資料庫會刪除資料,主金鑰變更可能使既有加密資料無法讀取。
常見錯誤速查
| 錯誤或提示 | 下一步 |
|---|---|
Configuration validation failed at startup | 查看錯誤欄位路徑,檢查設定和參照關係 |
no such table | 確認 D1 Binding、環境和遷移狀態 |
Binding ... not found | 檢查實際繫結,產生型別不會建立資源 |
redirect_uri_mismatch | 核對第三方平台和應用程式使用的完整回呼網址 |
emailSendTooOften | 檢查郵件寄送配額與重複提交情形,不要持續重試 |
PAYMENT_NOT_CONFIGURED | 檢查目前 Worker 的 Stripe 連線與金鑰 |
WEBHOOK_BUSY | 查看這個事件的處理租用資訊與記錄,不要刪除帳本 |
paymentsProductAlreadyPurchased | 檢查方案的重複購買規則和既有購買紀錄 |
Command outcome needs manual review | 先核對外部執行效果,避免重複傳送或重複授予權益 |
| 401、403、429 | 搭配回應本文,區分工作階段、權限、來源驗證和流量限制問題 |