NestJSとclass-validatorでPOST時に検証をする

class-validatorをインストールした 前回はclass-validatorをインストールしDTOと接続した。 が、結果は前回の記事に書いた通りだった。 なので、バリデートを効くようにしたい。 main.tsにバリデートを読み込む import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe()); await app.listen(3000); } bootstrap(); つまりバリデートするという指示が漏れていた。 ただこれだとclass-transformerが足りないと怒られる。 class-transformerをインストールする npm i --save class-transformer これで怒られなくなった。 間違った情報をPOSTする $ curl -d '{"firstName":1111, "lastName":"yamada", "isActive":"string"}' -H "Content-Type: application/json" -X POST http://localhost:3000/sample {"statusCode":400,"message":["firstName must be a string"," isActive must be a boolean value"],"error":"Bad Request"} よし、怒られたのでオッケー。

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

NestJSでDTO(データ転送用オブジェクト)を使用しCRUD操作を行ってみる

検証ライブラリーをインストール npm install class-validator --save これは、見出しの通りPOST時に検証してくるライブラリー。 デコレータおよび非デコレータ ベースの検証の使用を許可します。内部的には、 validator.jsを使用して検証を実行します。Class-validator は、ブラウザと node.js プラットフォームの両方で動作します。 ちなみにバージョンは"class-validator": "^0.14.0"←の通り。 データ転送オブジェクトを作成する データ転送オブジェクト (DTO)とは アプリケーションで受信するデータ用に適切なデータ構造を作成、検証しやすくするもの。 DTO を使うことで、リクエスト本文から抽出されるオブジェクトの形状を指定でき、検証の組み込みが容易になるとのこと。 ちなみにDTOは英語名(Data Transfer Object)と日本語読みの略が一致した稀有な例。 DTO をセットアップする src/sample/dtoにcreate-sample.dto.tsを作成する。ファイルの内容は下記の通り。 import { IsBoolean, IsString } from 'class-validator'; export class CreateSampleDTO { @IsString() firstName: string; @IsString() lastName: string; @IsBoolean() isActive: boolean; } 上記でフィールドのデータ型が stringorboolean型であるかを確認している。 それぞれのファイルにDTOを読み込む ファイルのインポートは割愛する。 sample.controller.ts create() { return this.sService.createSample(); } ↓に変更する。 create(@Body() createSampleDTO: CreateSampleDTO): Promise<Sample> { return this.sService.createSample(createSampleDTO); } sample.service.ts public async createSample(): Promise<Sample> { return await this....

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

NestJsとMySQLでCRUD操作を行ってみた

前回の修正と準備 前回testというEntityを作ったけど、わかりにくくなるのでsampleに変更した。 モジュールの作成 npx nest g module sample まず上記コマンドを使用し、モジュールを作る。なぜモジュール化するかを調べると散らかるので、また別の機会に。 公式ドキュメントに 対応するモジュール ディレクトリ内のドメインの近くに作成することをお勧めします。 と記載されているので、sample.entity.tsを作成したサンプルモジュール内に移行する。 必要なファイルを作成する npx nest g controller sample --no-spec npx nest g service sample --no-spec controllerとserviceを作成する。 controllerはルーティングを指定し、serviceは処理の記述を書くファイルという認識。 最後に、DBと疎通操作するためのRepositoryを作成する。なぜか作成するコマンドが用意されていないようなので、自作する。 cd src/sample touch sample.repository.ts 各ファイルを作成する sample.repository.ts リポジトリはEntityManagerと同じですが、その操作は具象エンティティに限定されます。EntityManagerを介してリポジトリにアクセスすることができます。 上記を読んでもなんのことかわからない。 import { Injectable } from '@nestjs/common'; import { Sample } from 'src/sample/sample.entity'; import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; @Injectable() export class SampleRepository extends Repository<Sample> { constructor(@InjectRepository(Sample) repository: Repository<Sample>) { super(repository....

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

NestJsにおけるMigrationと「synchronize: true」を調べてみた

synchronize: true とは 公式ドキュメントを呼んでいる際は読み飛ばしたが、下記のようなことが書かれていた。 Setting synchronize: true shouldn’t be used in production - otherwise you can lose production data. 翻訳すると「設定synchronize: trueは本番環境では使用しないでください。そうしないと、本番データが失われる可能性があります。」とのこと。読み飛ばすにはあまりにも恐ろしい項目な気もするが、当時に自分は気にも留めなかった。 これがマイグレーション作業と深く結びついている。 synchronize: true この設定は、アプリケーションをデプロイしたときにDBのテーブルがEntityから自動的に生成されるというもの。 そのため前回の記事のように、Entityを作成しセーブすることで自動的にテーブルが作成された。 どうやらすごく便利な設定だと思うようだが、危険もある。 Entityの状態がDBに同期されるため一見便利にみえますが、Entityのカラムを消したときにDBのカラムも消えてしまうため、誤ってPasswordのカラムを消してしまうなどのリスクがあります。 確かに誤って、コードを削除し、保存したらすべてのデータが消えるというのは非常に恐ろしい。 そこで本番に上げる前にsynchronize: falseにし、マイグレーションファイルを元に手動でDBの状態を更新するようにしていく必要がある。 Migrationとは マイグレーションの正体は普通のJSファイルで、SQLを使用してデータベースのスキーマを更新したり、既存のデータベースに変更を加えるというものです。 つまり、同期的な変更ではなく、こちらでコマンドを行うことで、データベースを変更してくれる。 いざ、本番で操作するよりは、開発の時点でテスト的に触っておいた方が良さそうなので、どこかでテストする。その際、詳細な操作方法を追記する。

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

Windows11に入れたMySQLとNest.Jsを接続し、テーブルを作成する

MySQLにデータベースを作成する まず、Windows11にいれたMySQLにデータベースを作成する。 net start mysql57 mySQLを立ち上げ、 mysql --user=root --password でログインする。 次に、下記クエリでデータベースを作成する。 CREATE DATABASE dbName; を実行する。 Query OK, 1 row affected (0.01 sec) と出ればデータベースが作成できている。 念のため、 SHOW databases; 上記クエリで確認すればデータベースを一覧で確認できる。 NestJsから接続する TypeORMをインストールする SQL および NoSQL データベースと統合するために、Nest は@nestjs/typeormパッケージを提供します。Nest がTypeORMを使用するのは、それが TypeScript で利用できる最も成熟したオブジェクト リレーショナル マッパー (ORM) だからです。TypeScript で記述されているため、Nest フレームワークとうまく統合されます。 ちなみにTypeORMとはnode.jsで実行される、TypeScriptで作ったObject Relational Mapperライブラリのこと。 ちなみにちなみに、Object Relational Mapperライブラリとは、データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法のことらしい。 つまり、いい感じに変換してくれるやつという浅い理解で進めていく。 npm install --save @nestjs/typeorm typeorm mysql2 Appモジュール読み込む インストールができたら、app.module.tsにTypeOrmModuleをインポートする。 import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule....

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