NestJSをAPI Gateway + AWS Lambdaで構成する（その５）- CRUD generatorを使い modules,controller, service, dto を生成する

#
- [その１ NestJSやLambdaでのnode.jsの話し](https://qiita.com/ssugimoto/items/988320d34022555401fb)
- [その２ NestJSのサンプルを動かす、Hello World.](https://qiita.com/ssugimoto/items/557e7a7cce5111bf5de7)
- [その３ コントローラーを追加する](https://qiita.com/ssugimoto/items/fcfbc9a176bcf41d7b45)
- [その４ DTOを使う](https://qiita.com/ssugimoto/items/613b8ab54bd6f8de043c)
- その５ CRUD generatorを使い modules,controller, service, dto を生成する
- [その６ インターセプター](https://qiita.com/ssugimoto/items/dce542a78fdfbaf1e434)
- [その７ ORMでRDBデータベースを扱う](https://qiita.com/ssugimoto/items/45e23d1b2879b083267c)
- [その８ NestJSをAPI Gateway＋AWS Lambdaとしてデプロイ](https://qiita.com/ssugimoto/items/74c26a8219a944d4acc4)

## CRUD generator
- 公式ドキュメント https://docs.nestjs.com/recipes/crud-generator

### users というREST API の CRUD用のコードを生成する

- コマンド実行結果例
```
$ nest g resource
? What name would you like to use for this resource (plural, e.g., "users")? users
? What transport layer do you use? REST API
? Would you like to generate CRUD entry points? Yes
CREATE users/users.controller.spec.ts (566 bytes)
CREATE users/users.controller.ts (894 bytes)
CREATE users/users.module.ts (247 bytes)
CREATE users/users.service.spec.ts (453 bytes)
CREATE users/users.service.ts (609 bytes)
CREATE users/dto/create-user.dto.ts (30 bytes)
CREATE users/dto/update-user.dto.ts (169 bytes)
CREATE users/entities/user.entity.ts (21 bytes)
UPDATE app.module.ts (385 bytes)
```

### cli の説明
```
$ nest g resource
? What name would you like to use for this resource (plural, e.g., "users")? 
```

1. cli 実行
    - コマンド実行したディレクトリ直下に作成される
    ```
    $ cd aws-node-typescript-nest/src
    $ nest g resource
    ```

2. ドメインや機能名・ユースケースを入力
    ```
    ? What name would you like to use for this resource (plural, e.g., "users")? 
    ```
    - ドメインとなるもの、機能となるもの、ユースケースの親となるもの、例えば、以下のようなディレクトリ相当を入力する

    | ディレクトリ相当 | 機能 | Center align |
    |:-----------|:------------:|:------------:|
    | users       | ユーザー系        | -        |
    | cats       | 猫        | -        |
    | cars       | 車系        | -        |
    | factories       | 工場        | -        |

3. REST APIを選択する

    ```
    ? What transport layer do you use? (Use arrow keys)
    ❯ REST API 
      GraphQL (code first) 
      GraphQL (schema first) 
      Microservice (non-HTTP) 
      WebSockets 
    ```

    ```
    ? What transport layer do you use? REST API
    ```

4. gerateするかの確認で「Y」を選択
    ```
    ? Would you like to generate CRUD entry points? Yes
    ```

### generateされたusers

```
src
└─users
    ├─dto
    │  ├─create-user.dto.ts
    │  └─update-user.dto.ts
    ├─entities
    │  └─user.entity.ts
    ├─users.controller.ts
    ├─users.controller.spec.ts
    ├─users.module.ts
    ├─users.service.spec.ts
    └─users.service.ts
```

- aws-node-typescript-nest/src/app.module.ts には、モジュールとして追加される
```app.module.ts
@Module({
  imports: [UsersModule],   // ←ここにモジュールとして追加
  controllers: [AppController, CatsController],
  providers: [AppService],
})
export class AppModule {}
```

### いくつか問題発生
- serverless frameworkの nestjsのexample では package.jsonやtsconfig.jsonの内容が古い
    -  `@Module`の機能まわりが動かない
    -  express のライブラリが無い
    -  typescript で 構文エラー 「,」

- package.json を一部抜粋
```package.json
  "dependencies": {
    "@nestjs/common": "^10.1.0",
    "@nestjs/core": "^10.1.0",
    "@nestjs/platform-express": "^10.1.0",
    "@nestjs/mapped-types": "2.0.2",
    "@vendia/serverless-express": "4.10.4",
    "reflect-metadata": "^0.1.12",
    "rimraf": "^2.6.2",
    "rxjs": "^7.8.1",
    "typescript": "^5.0.1"
  },
```

- package.json で、以下の通り変更
    - `"aws-serverless-express": "^3.3.5",` から `"@vendia/serverless-express": "4.10.4",` に変更。
    - `"@hewmen/serverless-plugin-typescript": "^1.1.17"`は削除、使わない

```tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "noImplicitAny": false,
    "removeComments": true,
    "noLib": false,
    "allowSyntheticDefaultImports": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es2021",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "esModuleInterop": true
  },
  "exclude": [
    "node_modules"
  ]
}

```
- `"esModuleInterop": true` を追加
- `"target": "es2021",` にして、Node16相当へ（もしくは、 es2022）
    - https://node.green/

### 寄り道
遭遇した問題解決するならば`nest cli`でプロジェクトを新規作成した方が良さそうに思えてくる

- プロジェクト新規作成の場合
    ```
    nest new nestjsapi-demo
    ```
- ドキュメント
     - https://docs.nestjs.com/faq/serverless#example-integration
     - Example integration
    ```
    First, let's install the required packages:
    
    $ npm i @vendia/serverless-express aws-lambda
    $ npm i -D @types/aws-lambda serverless-offline
    ```
- src/main.ts の書き方は、公式ドキュメントそのままに書き換える


## 感想
- かなり便利だな
- よくあるどこかのユースケースや機能をまるっとコピーして雛形のようにする必要はない