0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-07-28

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)

寄り道

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

  • プロジェクト新規作成の場合
    nest new nestjsapi-demo
    
  • ドキュメント
    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 の書き方は、公式ドキュメントそのままに書き換える

感想

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0