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

複雑な文字列パターンをマッチさせる必要がある場合はIF分ではなく正規表現を使うべきだとChat GPTが言ってた

従来 考えてみたと書いたが、そもそも従来の書き方だとどうしても汚く見えてしまうので、これを機に綺麗にしようという次第である。 で、その従来の書き方といえば、 /* 文豪がランダムで抽出される */ const targetArray = ['三島由紀夫','太宰治','夏目漱石','芥川龍之介','宮沢賢治'] const randamIndex = Math.floor( Math.random() * targetArray.length ); const target = targetArray[randamIndex] /* 文豪が芥川か太宰ならture */ const matchCondition = (target) => { return target === '芥川龍之介' || target === '太宰治' } console.log(target, matchCondition(target)) こんな感じ。 条件が少なければ別にいいけど、条件が多い場合はtarget === 'hoge'を沢山繋いでいく必要がある。 これをもっと綺麗にしたい。 正規表現を使いましょう const condition = /\芥川龍之介|太宰治\b/ console.log(target, condition.test(target)) これで、わざわざtarget === 'hoge'でつなぐことなく/\芥川龍之介|太宰治\b/に文豪名を増やしていくだけで済むようになった。 Chat GPTは? 考えたコードが本当に正しいか、シンプルか、美しいかの判定ができないので、流行のChat GPTにも考えてもらった。 三島由紀夫、太宰治、夏目漱石、芥川龍之介、宮沢賢治の中の1つがランダムに抽出されるデータがあり、抽出されたデータが芥川龍之介か太宰治ならtrueを返すコードをJavascriptで書いて こんにちは!下記がそのコードになります: const writers = ['三島由紀夫', '太宰治', '夏目漱石', '芥川龍之介', '宮沢賢治']; const selectedWriter = writers[Math....

投稿日 · 2023-03-19 · 更新日 · 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

git pullした時に、「error invalid path」というエラーが出たので解決する

error: invalid path タイトルに書いたが、 error: invalid path git pull したところ上記エラーがでた。 調査しつつメモに残そうと本記事のタイトルでマークダウンファイルを作成しようとしたところ、エラーがでた。つまりたぶん、それが原因だと思われる。ちなみにエラーの内容は、:をファイル名に使うことはできないとのこと。 でまあ、たぶん上記の通りなんだろうけれど、いちおう調べてみた結果「ファイル名にWindowsのファイルシステムで使えない文字]が含まれているのが原因」とその通り。 解決方法 シンプルな解決方法はブラウザでGithubにアクセスし、名前を変更する。 または、Gitの設定を変更する。 git config --global core.protectNTFS false ファイル名に禁則文字を含むリポジトリを Clone できない(true)という設定をfalseにすることで、エラーははかなくなる。 ただ結局Cloneしたことでファイル名が変更されたので、ファイル名を変更する必要があった。

投稿日 · 2023-03-12 · 更新日 · 2024-06-07 · 1 分 · 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