LambdaにのせたNestJSでapp.enableCors();を指定しているのにCORSエラーがでたので解消するまでを記録した

POSTメソッドを叩いたらエラーが出た NestJSで作成したAPIをLambdaに乗せ、API Gatewayでエンドポイントを作成した。 フロントエンドはNextJSで作成し、Vercelにデプロイした。 で、無事画面表示とGetが成功し、得たいデータが表示された。 ただPOST APIを叩いた時 Access to fetch at 'https://xxxxxx.amazonaws.com/api/v1/login' from origin 'https://xxxxxxx.vercel.app' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status. というエラーがでた。 CORSは有効にしている 上のエラーを読む限り、CORSに関するエラーということがわかる。 ただNestJSの方でCORSは有効にしている。 該当のソースは下記の通り。 const app = await NestFactory.create(AppModule); await app.init(); app.useGlobalPipes(new ValidationPipe()); app.useGlobalFilters(new HttpExceptionFilter()); // CORSの有効化 app.enableCors(); const expressApp = app.getHttpAdapter().getInstance(); return serverlessExpress({ app: expressApp }); Getはできているし、CORSもきっと有効に出来ているに違いない。 じゃあ、なんでPOSTはできないの? 沼に落ちた。 解決方法 ちなみに同じ状況に陥った人のために先に解決方法を載せておくと、下記のようにawait app....

投稿日 · 2023-07-12 · 更新日 · 2024-06-07 · 2 分 · nove-b

NestJsで作成したプロジェクトをAWSのLambdaにあげて動かすまでの作業ログを残しておく

個人開発プロジェクトのバックエンドをNestJSで作成した。 公開したいので、awsのLambdaに乗せて動かしてみることにした。 初めてのaws、いつかの自分のために記録として一挙手一投足のログを残しておくことにする。 前提 $ node -v v18.16.0 "@nestjs/cli": "^9.0.0", バージョンは上記の通り。 で、Dockerの設定ファイルを諸々作ったが、使っていないので、ない前提でいく。 さて、それでは進めていく。 AWSアカウントの作成 AWSの公式ウェブサイトでアカウントを作成する必要がある。 ルートユーザーの E メールアドレス AWS アカウント名 で新規アカウント作成ができる。 その後、認証コードを経て、 パスワード 連絡先情報(英語で書けって言われたのでchatGPTに住所教えて英語にしてもらった...個人情報) 請求情報 本人確認 サポートプランを選択→無料のベーシックを選択 AWS アカウント作成の流れを参考にすればいけるけど、意外と時間画かかったし、アカウント作成時にクレジットカードを登録することはいい気がしない。 とりあえず、これでアカウント作成が完了した。 必要なパッケージのインストール ここからはNestJS-サーバーレスの公式を参考にしていく。 説明のために、Nest (@nestjs/platform-express完全に機能する HTTP ルーター全体を使用して起動) をサーバーレスフレームワーク (この場合は AWS Lambda をターゲットとしています) と統合します。 公式もawsで説明してくれているので、ありがたい。 $ npm i @vendia/serverless-express aws-lambda $ npm i -D @types/aws-lambda serverless-offline まずは上記の通り、必要なパッケージをインストールする。 "@vendia/serverless-express": "^4.10.4", "aws-lambda": "^1.0.7", "@types/aws-lambda": "^8.10.119", "serverless-offline": "^12.0.4", 上記のようなバージョンがインストールされた。 次に、serverless.ymlファイルを作成する。 service: serverless-example plugins: - serverless-offline provider: name: aws runtime: nodejs14....

投稿日 · 2023-06-25 · 更新日 · 2024-06-07 · 4 分 · nove-b

NestJSのエラーレスポンスをカスタマイズする

NestJSを用いAPI作成をしているのだが、Responseを共通化したいと思ったので、実装してみた。 Responseの定石 とは言えそもそもResponseの形をどのようにするのがいいのかわからなかったので調べた結果、omniti-labs/jsendが参考になりそうだった。 これを参考に以下のような型で返すことにした。 export interface Response { status: 'success' | 'error'; data: any; message: string[] | null; } ValidationPipeを使用する場合、エラーレスポンスの形式はBadRequestExceptionがデフォルト たぶんドキュメントにある通り(Documentation | NestJS - A progressive Node.js framework)なので、ほとんどの場合ValidationPipeを使用することになる。 そうするとエラーレスポンスの形式はBadRequestExceptionがデフォルトになるので、以下のように返ってくる。 { "statusCode": 400, "message": "Bad Request Exception", "error": "Bad Request" } これは意図した形ではないのでカスタマイズする必要がある。 http-exception.filter.tsを作成する カスタマイズするにはそれ用のException filtersを用意する必要がある。 Exception filtersとは、 Nestには例外処理レイヤーが組み込まれており、アプリケーション全体で処理されない例外をすべて処理する責任を負っています。アプリケーションのコードで処理できない例外は、このレイヤーでキャッチされ、適切なユーザーフレンドリーな応答が自動的に送信されます。 というものらしい。 とにかく例外フィルターは、NestJSアプリケーションが例外をキャッチした場合に呼び出されるらしい。 実装は簡単 まずはhttp-exception.filter.tsを作成する。 import { ExceptionFilter, Catch, ArgumentsHost, HttpException, } from '@nestjs/common'; import { Response } from 'express'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host....

投稿日 · 2023-05-07 · 更新日 · 2024-06-07 · 1 分 · nove-b

NestJSでOpenAPIツール「swagger」を生成する

依存関係をインストールする npm install --save @nestjs/swagger main.tsを編集する async function bootstrap() { const app = await NestFactory.create(AppModule); // Swaggerの記述 const config = new DocumentBuilder() .setTitle('Cats example') .setDescription('The cats API description') .setVersion('1.0') .addTag('cats') .build(); const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('api', app, document); await app.listen(3000); } bootstrap(); 後は上の記述を編集し、http://localhost:3000/api/を開けば作成されている。 非常に楽なので活用していきたい。 APIをグルーピングする これだとcatsというタグができるがその中は空になり、すべてがdefaultにグルーピングされる。 任意のグルーピングを作りたい時は、hoge.controller.tsを下記のように変更する。 import { Controller } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; @Controller('hoge') @ApiTags('hoge') export class HogeController { constructor(private readonly sService: HogeService) {} これで意図した形になる。

投稿日 · 2023-04-23 · 更新日 · 2024-06-07 · 1 分 · nove-b

NestJSでMySQLと接続するモジュールを外部化し環境変数にする

環境変数化とDB接続のモジュール化 綺麗にって漠然と書いたが、 環境変数化 DB接続のモジュール作成 を行っていく。 DB接続のモジュール作成 まずは外部モジュール化する。 nest g mo database で、データ接続用のモジュールを作成する。 import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule.forRootAsync({ useFactory: () => ({ type: 'mysql', host: 'localhost', port: 3306, username: 'username', password: 'password', database: 'database-name', entities: [], synchronize: true, }), }), ], }) export class DatabaseModule { } 次に、app.module.tsの方を編集する。 @Module({ imports: [ DatabaseModule, ], 設定をべたでimportしていたので、それを外部モジュールに変換する。 これで外部化は完了。 環境変数化 次に環境変数化していく。 npm install @nestjs/config で、環境変数から読み込むためのパッケージをインストールする。...

投稿日 · 2023-04-19 · 更新日 · 2024-06-07 · 1 分 · nove-b