Nest.Js 搭配NestJsx/crud 製作RESTFUL API 踩坑分享

前言

使用NestJsx/crud來製作基本的crud,只要寫好基本的設定,馬上就可以產出crud api
表格不複雜的話,靠著此套件,幾乎可以在半小時內完成所有的api
又有提供@nestjsx/crud-request供前端使用,也不必自己辛苦讀他的API來串queryString
寫出來的Code可讀性也相當高
若是自己的獨立小專案,真心省事又方便!

不過遇到問題時就相當頭痛了!畢竟所有程式碼幾乎都由套件自動完成

針對UPDATE操作才需要檢核此欄位,CREATE時不檢核

在typeOrm的entity中,可以傳入groups參數({ groups: [UPDATE, CREATE] })來指定何時才做檢核
很直覺的就會想到,把CREATE拿掉就可以了!
但實際在測試時,會發現一直失敗!
所幸作者也有提出解決方式。看起來是偏向class-validator的使用方式有誤
不過突然遇到時,當下還真不會馬上聯想到呀!

把不需要檢核的寫在@IsOptional就可以了!
比如副標題寫的:create時非必填(資料庫直接帶預設值),但update時必須有檢核(範例為@IsNotEmpty)

1
2
@IsOptional({ groups: [CREATE] }) 
@IsNotEmpty({ groups: [UPDATE] })

錯誤訊息"an unknown value was passed to the validate function"

通常id欄位,我們都會直接用@PrimaryGeneratedColumn()遞增數字或著uuid自動產生
若是用做特定代號的狀態表,通常id就直接用string
畢竟可能就固定幾個英文代碼便於判斷,也不會有過大的擴張

entity大概會長這樣

1
2
3
4
5
6
@PrimaryColumn({type: 'varchar', length: 1 })
id: string;

@IsString({message: '須為字串'})
@Column({type: 'text', nullable: true})
name: string;

此時直接運行,會發現出現錯誤!

an unknown value was passed to the validate function

Google搜了老半天也查不太到什麼有用資訊-.-
認真解析了一下他的錯誤訊息,似乎是要做validate,但卻沒提供

於是嘗試在id上增加@IsString(),就可以了!
等於要pass一個檢核讓他可以過去

若狀態表很明確就固定幾個英文字
比如訂單狀態,NOT_ARRIVED(未到貨)、FINISH(完結)、ARRIVED(已到貨)
取其首碼英文N、F、A
做得精緻些,用@IsEnum()更佳!

後記

從解法來看,其實都不算困難
而整個CRUD API都是由套件產生,不用寫什麼程式碼確實很爽快
但卡住的地方卻不能OVERRIDE自己寫邏輯,尤其已經寫了好幾個API了才遇到
會擔心是不是之前的都要全部重寫,反而產生更大的憂慮感

所幸順利排除問題,而多虧了NestJsx/crud,對於簡單表的基本操作真的是省下了不少時間
有自己邏輯的部份,再OVERRIDE就好。也讓整體程式碼乾淨、簡單、易讀

參考資料

GitHub / IsNotEmpty at Creation + IsEmpty at Update