# 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}]"}