iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Modern Web

《NestJS 絕地求生手冊》:我用一年血淚換來的實戰排雷筆記 系列

《NestJS 絕地求生手冊》整理一年來從 Angular 前端轉向 NestJS 後端開發時實際踩過的坑。系列將依問題發生階段,從 DI、Module、DTO 驗證、型別轉換、TypeORM,到 Interceptor、Exception Filter 與 Swagger,拆解 30 個常見但容易卡關的情境。這不是從零教學,而是一份面向實戰的排雷筆記,希望幫助開發者更快定位問題、理解 NestJS 的運作方式,少走一點冤枉路。

參賽天數 26 天 | 共 26 篇文章 | 0 人訂閱 訂閱系列文 RSS系列文
DAY 11

Day 11|跨不過的牆:CORS 設定明明開了,前端卻還是拿不到回應?

隨著專案進入前後端串接的階段,我們的 API 終於要面對真實世界的考驗了。說到前後端分離,開發者一定都遇過一堵無形的牆——跨來源資源共用(CORS)。 你可能會...

2026-09-25 ‧ 由 YUN 分享
DAY 12

Day 12|失靈的守衛:為什麼 DTO 不能用 interface 和 type?

解決了前面「路由與請求進入」階段 CORS 與路由匹配的難題,今天我們正式進入「請求解析」的新階段。 當後端準備接收這些請求時,身為工程師要注意的鐵律就是:「永...

2026-09-26 ‧ 由 YUN 分享
DAY 13

Day 13|消失的 Class 實例:transform: false 到底保留了什麼,又丟掉了什麼?

昨天我們將 DTO 改為實際存在於執行期的 class,讓 ValidationPipe 成功攔下格式錯誤的請求。今天我們要面對另一個極度困擾開發者的反直覺陷阱...

2026-09-27 ‧ 由 YUN 分享
DAY 14

Day 14|形同虛設的內層防線:為什麼巢狀 DTO 驗證不生效?

接續前兩天對 DTO 類別實例(Day 12)與 ValidationPipe 運作流程(Day 13)的拆解,今天我們進入 API 請求解析中極為常見、也極易...

2026-09-28 ‧ 由 YUN 分享
DAY 15

Day 15|空值的考驗:明明加了 @IsNotEmpty(),為什麼 null 還是能過?拆解 @IsOptional() 條件驗證的機制

今天我們把焦點放回一個單純的欄位:文章標題(title)。建立文章時,我們規定標題為必填欄位,但在更新文章(PATCH)時,使用者可能只想更換內文,並不打算修改...

2026-09-29 ‧ 由 YUN 分享
DAY 16

Day 16|Boolean 的謊言:為什麼查詢參數寫了布林值,判斷卻永遠出錯?

在 NestJS 中處理網址查詢參數時,最棘手的問題往往不是驗證被擋下,而是轉型過程發生偏差,導致系統帶著錯誤的值繼續執行後續邏輯。 特別是傳入 ?isPubl...

2026-09-30 ‧ 由 YUN 分享
DAY 17

Day 17|消失的陣列:當查詢參數只有一個值時,為何變成字串?

昨天我們聊到了查詢參數中「布林值其實只是字串」的坑,揭穿了 TypeScript 型別並無法改變 HTTP 傳輸層的真實資料形狀。今天,我們要接著看另一個延伸問...

2026-10-01 ‧ 由 YUN 分享
DAY 18

Day 18|伺服器崩潰危機:FileInterceptor() 如何在尖峰時刻榨乾你的記憶體

順利闖過前幾天對 DTO 驗證、查詢參數陷阱的重重關卡,今天我們來到了「請求解析」階段的終站——「檔案上傳」,這背後藏著一個容易被忽略的記憶體危機。 NestJ...

2026-10-02 ‧ 由 YUN 分享
DAY 19

Day 19|遺失的實體:為什麼 TypeORM 找不到 Entity?

剛開始在 NestJS 中整合 TypeORM 時,我們通常會先完成資料庫連線,接著建立第一個實體(Entity),並在 Service 中透過 @Inject...

2026-10-03 ‧ 由 YUN 分享
DAY 20

Day 20|隱藏的前置查詢:save() 如何在更新時悄悄吞噬你的資料庫效能?

在使用 TypeORM 時,為了圖方便,我們常習慣不論新增或修改,都一律呼叫 save() 來搞定。這種「一招打天下」的寫法雖然順手,卻可能在無意間為資料庫帶來...

2026-10-04 ‧ 由 YUN 分享