疑難排解

從現象定位至設定、資料和執行階段,排查本機開發、驗證、付款、背景工作與部署問題。

遇到問題時,先確認「哪一步尚未完成」,再決定要修改什麼。本章依目前預設範本的實際流程分為六篇,將同一業務流程中的問題放在一起,避免在驗證、電子郵件、OAuth,或付款、Webhook 之間反覆切換。

從現象找到文章

現象閱讀文章檢查重點
安裝失敗、啟動失敗、建置失敗、內容未更新本機開發與建置Node.js、初始化、設定驗證、內容產生
缺少資料表、查不到資料、遷移失敗、約束衝突資料庫與遷移目標資料庫、既有結構、遷移紀錄
登入重新導向、驗證碼、電子郵件、Google 或 GitHub 登入失敗登入、電子郵件與 OAuthCookie、驗證狀態、寄信模式、回呼設定
Checkout 失敗、已付款卻未開通、Webhook 發生錯誤付款與 WebhookStripe 連線、事件帳本、交易、權益授予
Queue 有訊息卻沒有結果、週期工作未執行、統計沒有資料背景工作與統計取用者分派、Event、Command、Cron
首次部署中斷、資源不存在、網域異常、線上仍是舊內容部署、資源與網域發布階段、資源歸屬、執行設定、內容同步

一、先固定重現條件

記錄執行環境、程式碼版本、存取網址、操作時間和最短重現步驟。例如,「正式環境,使用一般帳號購買 yearly 方案,Stripe 已完成付款,重新整理產品頁後仍無法使用」,比「付款壞了」更容易定位問題。

本機和正式環境應分別觀察。不要因為本機 D1 中沒有紀錄,就推斷正式環境的付款尚未寫入資料庫,也不要在本機修改 .env 後,直接驗證線上行為。

證據取得位置用途
請求方法、路徑、HTTP 狀態和回應本文瀏覽器 Network區分前端未送出請求、介面拒絕請求和伺服器端例外
第一個例外、請求時間、關聯 ID本機終端機、Worker 記錄找出失敗步驟,關聯後續處理
Event ID、Checkout ID、內部執行 ID付款平台和應用程式記錄追蹤同一筆業務,不憑時間接近就推測是同一筆
設定項目名稱、資源名稱和 IDconfig/、wrangler.jsonc確認目前應用程式使用的目標
資料表結構、狀態和紀錄時間對應 D1 的唯讀查詢判斷哪些步驟的結果已儲存

API 的 code 有時是數值結果碼,有時屬於第三方協定,也可能不存在。數值碼可在 src/errors.ts 中查詢,不能將所有回應都視為完整的 APIResponse<T>。

分享排錯資訊時,請隱藏 Cookie、Token、金鑰、驗證碼和收件人資訊。本機郵件預覽會包含郵件內文,複製終端機輸出前也要檢查。

二、先看診斷結果,再看業務結果

在初始化後的專案根目錄,依環境選擇一個檢查指令:

# 本機設定
npm run doctor
# 正式環境設定與 Cloudflare 帳戶可用性
npm run doctor:remote

doctor 會檢查設定、變數、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搭配回應本文,區分工作階段、權限、來源驗證和流量限制問題

需要查詢精確欄位時,請使用參考手冊。需要從頭完成一次發布時,請使用部署上線。