
這一週我在改一件事:程式遇到狀況時,要老實告訴使用者發生了什麼。不管是斷網、存檔失敗,還是對方網站在排隊,畫面都不該給出錯誤或誤導的說法。
斷網和存檔失敗,畫面要說實話並給重試鍵
Nailora 是一個幫人找美甲師、預約美甲的 App,第一版正在蘋果審查中。我先做了一輪稽核,專找「看起來沒事、其實有事」的地方。
例如斷網時評價頁會一直轉圈,有些存檔失敗時畫面卻顯示成功。這就像跟店員說要退貨,店員笑著說好,其實什麼都沒辦。我把這些地方改成明確顯示「連線失敗」並附上重試,存檔失敗也直接說失敗。
下次你測試自己的作品,可以故意斷網,把每個會轉圈、會存檔的畫面走一遍。成功訊息必須對應到真的成功。
技術細節:三批稽核修正,隨 1.1.0 發布
- d29f090(HF-098a):評價一覽與相簿編輯斷網改為連線失敗可重試;外觀偏好讀取失敗不卡啟動畫面;登入後個人檔缺漏自動重取。
- 8400d6c(HF-098b):菜單表單、預約詳情、訊息送出、通知開關、刪除筆記失敗改為提示;建單與取消後的系統訊息失敗不再誤報。
- 8456dd5(HF-098c):班表時間送出前驗證、登入回跳只收站內路徑等。
- 驗收腳本 hf098a-appearance.ts、hf098b-api-failur 系列、hf098c-pure.ts 都是改前有失敗、改後歸零。
店家改完先預覽,不必存進去才知道長怎樣
Nailora 的店家端現在多了「預覽」鈕。店家編輯店家資料、菜單、美甲師、預約設定時,按下去就能用還沒儲存的內容,看顧客眼中的畫面。頂端有黃色橫幅提醒這是預覽,內容只暫存在手機記憶體,不會寫進資料庫。
預約流程也能整段試走,但最後一步不能真的送出。這像是先試穿再決定買不買。收藏、送出這類會真正寫入的按鈕,在預覽中全部擋下。
下次你做「試做」功能,要把暫存資料和正式資料分開,並把會真正生效的按鈕關掉。否則試走一不小心就變成真的下單。
技術細節:預覽用記憶體草稿,儲存與預覽共用同一份內容
- 新增 lib/hooks/usePreview.ts 與 components/shop/PreviewBanner.tsx,草稿放在 PreviewContext。
- applyShopDraft、applyMenuItemDraft、applyNailistDraft、applyBookingSettingsDraft:沒有草稿時回傳同一個參照,新增項目以 preview-new 追加。
- 儲存與預覽共用同一份送出內容(buildProfilePay、buildBookingSettings),避免兩邊不一致。
- 對應 4.6-7、4.6-8,commit 為 fd07fd8、ed7d686、cdeca60、a5fd4a6。
對方網站在排隊或關店,工具要照實回報
plurkpost 是我用來把日本商品網頁整理成噗浪貼文的工具。有些商店在人多時會把訪客丟進排隊頁,或顯示店家暫時關閉。工具卻回報「可能已下架或網址錯誤」,甚至叫我回報爬蟲失效。這像是到店門口看到「今日公休」,卻回報店址寫錯。
現在工具認得這兩種狀況,畫面直接寫出原因,並隱藏回報失效的按鈕。批次載入遇到時會整批停下,不再一件件重試。
下次你自己包裝錯誤訊息時,要把原始原因一路帶到畫面。不確定的猜測不要加進去。
技術細節:SITE_QUEUE 與 SHOP_CLOSED 的錯誤代碼要保留
- scrapers/lib/http.js 的 request() 以 beforeRedirect 呼叫 classifyRedirect():轉到 queue-it.net 判為 SITE_QUEUE,同主機轉到 /password 判為 SHOP_CLOSED(8f4a614,O-50)。
- nijisanji、aniplex 改包錯誤時保留原錯誤 code(2ab9688、62a9065)。
- 比對腳本與故障注入測試遇到被擋的回應會立即停止真實請求,且不寫快取(O-53、O-55)。
接下來
- Nailora 1.1.0 要等第一版審查結果,再進實機驗收。
- 行事曆小月曆是否要做,還在等我裁決。
- 翻譯要不要改用 Claude,尚未決定,目前仍用 Gemini。
本篇由跨專案自動彙整產生,素材為 2026-10-19 之後 6 個專案的提交紀錄與 0 則知識投遞。