在前面的旅程中,我們成功把 AI 助教的各項核心功能與前端串接起來。今天原本的計畫是滿心期待地把專案部署到 Vercel,讓我們的 AI 助教不只能在自己的 MacBook 上演獨角戲,讓學生能夠用網址隨時使用。
然而,現實總是充滿驚喜。當我按下部署按鈕的那一刻起,Vercel 立刻送上一記震撼彈:
FUNCTION_INVOCATION_FAILED
ENOENT: no such file or directory, mkdir 'uploads/'
這行錯誤訊息讓我深刻體會到軟體工程中一句名言的真諦:「在你的電腦上可以跑,不代表在雲端環境也能跑。」
為了讓 Vercel 順利跑起我們的 Node.js 後端與 RAG(PDF 上傳與解析)功能,我們經歷了以下兩個關鍵的架構轉折:
原本在 routes/ragRoutes.js 中,我們習慣使用 multer 把使用者上傳的 PDF 暫存在本機的資料夾中:
// 原本的寫法(只適用於有長期狀態的本機伺服器)
const upload = multer({ dest: 'uploads/' });
但在 Vercel 的 Serverless Function 架構中,檔案系統是唯讀且瞬息即逝的,根本沒有一個固定的長期資料夾讓我們狂建 uploads/。
/tmp/:// 修改後的寫法
const upload = multer({ dest: '/tmp/' });
改完程式碼後,我開心地 git push 上去,卻發現 Vercel 依然死性不改地報一樣的錯。檢查後才驚覺:GitHub 上的最新代碼,不等於 Vercel 正在執行的版本!
而且因為本機的 Git Email 設定與 GitHub 帳號不匹配,導致 Vercel 的自動部署被阻擋:
排查指令:Bash
git config user.name "你的使用者名稱"
git config user.email "你的正確Email"
git commit --allow-empty -m "trigger Vercel deployment"
git push origin main
當我們再次確認 Vercel 的 Deployment 指向最新的 Commit 雜湊碼後,網站終於順利亮起綠燈!

這次的踩坑經驗雖然折騰,但對開發教育型 AI 產品來說是極佳的成長。我們平時在本地端開發時,很容易忽略「基礎設施(Infrastructure)的限制」。
當我們的 AI 助教未來要正式服務廣大師生時,不能只依賴簡單的 /tmp/ 暫存,長遠來看必須導入真正的雲端儲存服務(如 Firebase Storage 或 Google Cloud Storage)。唯有經歷過這些從本機到雲端的部署考驗,我們打造的系統才真正具備了走向產品化與規模化的實力。
明天我們將進入 Day 20:【Prompt 疊代】根據反饋優化 Prompt:解決 AI 太囉嗦與爆答案問題!