- その1 NestJSやLambdaでのnode.jsの話し
- その2 NestJSのサンプルを動かす、Hello World.
- その3 コントローラーを追加する
- その4 DTOを使う
- その5 CRUD generatorを使い modules,controller, service, dto を生成する
- その6 インターセプター
- その7 ORMでRDBデータベースを扱う
- その8 NestJSをAPI Gateway+AWS Lambdaとしてデプロイ
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")?
-
cli 実行
- コマンド実行したディレクトリ直下に作成される
$ cd aws-node-typescript-nest/src $ nest g resource
-
ドメインや機能名・ユースケースを入力
? What name would you like to use for this resource (plural, e.g., "users")?
- ドメインとなるもの、機能となるもの、ユースケースの親となるもの、例えば、以下のようなディレクトリ相当を入力する
ディレクトリ相当 機能 Center align users ユーザー系 - cats 猫 - cars 車系 - factories 工場 - -
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
-
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
- ドキュメント
- 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 の書き方は、公式ドキュメントそのままに書き換える
感想
- かなり便利だな
- よくあるどこかのユースケースや機能をまるっとコピーして雛形のようにする必要はない