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
)
@IsOptional({ groups: [CREATE] })
@IsNotEmpty({ groups: [UPDATE] })
錯誤訊息"an unknown value was passed to the validate function"
通常id欄位,我們都會直接用@PrimaryGeneratedColumn()
遞增數字或著uuid
自動產生
若是用做特定代號的狀態表,通常id就直接用string
了
畢竟可能就固定幾個英文代碼便於判斷,也不會有過大的擴張
entity大概會長這樣
@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就好。也讓整體程式碼乾淨、簡單、易讀