---
# System prepended metadata

title: nest 心得

---

# 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
  
```
