# nest 心得 * src/ 存放的是 model * Module * import:描述要引用的model,import 進來的東西才能被 Controller使用 * provide:要依賴注入的類別(Value Class Factory) * controller:有哪些 controller、expoer:對外提供的功能 * controller 操作 service, * controller 請求進入點、流程控管、資料返回層 * service 商業邏輯層, 並切操作 dao * dao 資料庫存取層,db 存取的最後介面 * dto 前端輸入資料格式定義,透過 nest.js Pipe 實現資料驗證 ### nest 是一個圍繞者 裝飾器為設計核心的框架 * 類別裝飾器用 ``` @Controller、@UseGuards(xxxGuard)、@UseFilters(xxxException) @Injectable()、@UseInterceptors()、' ``` * 方法裝飾器用 ``` @Get、@Post、@Put、@Patch、@Delete、@Header、@UsePipes @ReflectMetadata(key:string, value:[]string) ``` * 參數裝飾器 ``` @Param、@Query()、@Body() ``` * 其它 ``` @UseFilters(xxxExceptionFilter) 全域使用 在 main.ts app.useGlobalFilters(new HttpExceptionFilter()); 或在 AppModule 的 provider 添加 ``` * Controller必須以@Controller decorator annoate 要被依賴的類別放在 @Module 的 providers 底下 ex: ``` @Module({ imports: [], controllers: [AppController, TodoController], providers: [AppService], }) ``` * ### @Controller('todos') ``` 'todos' 被表明為此 Controller 之路由 ``` * ### @Header('X-Hao-headers', '1') ``` KEY:X-Hao-headers VALUE 1 猜測,奇數位是 key,緊接者key 之後的欄位則是對應到的value ``` * ### @UseGuards(xxxGuard) ``` 編寫 xxxGuards // 實作CanActive介面 class AuthGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { // 透過 context 取得對應controller及request/request資訊 // 以及各種相對應資源,來判斷請求是否可以通過 } 跟 @UsePipes的差別在,一個是驗證請求的資料(方法),一個是驗證請求的安全性(類別) ``` ## 功能介紹 @Param 取得特定路由參數 @Query() 取得 query 參數 ```@Controller('todos') export class TodoController { @Get() getList(@Query() query: { limit: number, skip: number }) { const { limit = 30, skip = 0 } = query; // default value } } // 當curl http://localhost:3000/todos?limit=1 時 // 就會觸發 TodoController 的 getList 並且 query.limit is 1 ```
{"metaMigratedAt":"2023-06-17T08:11:35.741Z","metaMigratedFrom":"Content","title":"nest 心得","breaks":true,"contributors":"[{\"id\":\"1fdf3ff7-2b80-4ba1-b189-58f06ffd619f\",\"add\":2178,\"del\":349}]"}
Expand menu