前回 takasehiromichiex.com カスケードを使用して関連オブジェクトを自動的に保存する方法 @OneToOne デコレータのオプションにカスケードを設定します。 src/entity/Photo.ts import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm"…
前回 takasehiromichiex.com オブジェクトとそのリレーションのロード PhotoとPhotoMetadataを一つのクエリで読み込みます。 src/index.ts import { AppDataSource } from "./data-source"; import { Photo } from "./entity/Photo"; AppDataSource.initiali…
前回 takasehiromichiex.com 関係の逆側 PhotoMetadataからPhotoへのリレーションは貼れていますが、Photoから PhotoMetadataへのリレーションは貼れていません。 リレーションを双方向にするためにエンティティを変更しましょう。 src/entity/Photo.ts impo…
前回 takasehiromichiex.com 1対1の関係を保存する データを保存してみましょう。 src/index.ts import { AppDataSource } from "./data-source"; import { Photo } from "./entity/Photo"; import { PhotoMetadata } from "./entity/PhotoMetadata"; AppDat…
前回 takasehiromichiex.com PhotoMetadataの作成 新しいモデルを作成してみます。 src/entity/PhotoMetadata.ts import { Photo } from "./Photo"; export class PhotoMetadata { id: number; height: number; width: number; oriientation: string; compre…
前回 takasehiromichiex.com Photoの更新 データベースからPhotoを取得して、更新して保存してみます。 src/index.ts import { AppDataSource } from "./data-source"; import { Photo } from "./entity/Photo"; AppDataSource.initialize() .then(async () …
前回 takasehiromichiex.com リポジトリの使用 今度は、リポジトリを使用するようにしてみます。 src/index.ts import { AppDataSource } from "./data-source"; import { Photo } from "./entity/Photo"; AppDataSource.initialize() .then(() => { console…
概要 こんにちは、高瀬です。 最近、 TwitterがAPI有償化したり、仕様が突然変わったりと、使いにくい状況が続いていますね。 エゴサしたら、「twitterのクローンが求められる」みたいなことがたくさん書いてあったので、中央集権型TwitterクローンSNS「Chit…
前回 takasehiromichiex.com Photoの作成 Photoを作成してデータベースに保存してみます。 src/index.ts import { AppDataSource } from "./data-source"; import { Photo } from "./entity/Photo"; AppDataSource.initialize() .then(() => { console.log("…
前回 takasehiromichiex.com DataSourceの作成 エンティティが完成したら、DataSourceを作成します。 src/data-source.ts import "reflect-metadata"; import { DataSource } from "typeorm"; import { Photo } from "./entity/Photo"; export const AppData…
前回 takasehiromichiex.com モデルの作成 ステップバイステップで進んでみましょう。 データベースの操作は、テーブルの作成から始まります。 テーブル = モデルです。 モデルを作成してみます。 src/entity/Photo.ts export class Photo { id: number; nam…
前回 takasehiromichiex.com モデルの作成 クイックスタートを使用したので、モデルは以下の通りになっています。 src/entity/User.ts import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"; @Entity() export class User { @PrimaryGenerated…
概要 次何書こうかな〜とか思ったり、連載形式やめようかな〜とか思ったりしましたが、結局連載形式にしちゃいました。 今回はTypeORMにちゃんと入門しようと思います。 公式 typeorm.io TypeORMについて TypeORMは、NodeJS、Browser、Cordova、PhoneGap、Io…
前回 takasehiromichiex.com TypeORMのマイグレーションについて モデルが変更される場合、それをデータベースに同期する必要があります。 synchronize: trueというオプションをルートモジュールで設定していましたが、これはEntityに基づいてテーブルを自動…
前回 takasehiromichiex.com サブスクライバ TypeORM サブスクライバを使用すると、特定のエンティティイベントをリッスンすることができます。 まず、エンティティを作成します。 src/cats/cats.entity.ts import { Column, Entity, PrimaryGeneratedColumn…
前回 takasehiromichiex.com TypeORM トランザクション TypeORMでトランザクションを処理することができます。 src/user/user.service.ts import { Injectable } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { Data…
前回 takasehiromichiex.com スキーマ Entityとしてモデルを定義するのとは別に、Entity Schemaで列の状態などを定義することができます。 Entity Schemaを作成してみます。 まず、Entityを修正します。 src/user/entities/user.entity.ts import { Photo } …
前回 takasehiromichiex.com ユーザモジュールへのEntityの紐付け ユーザモジュールへEntityを紐づけます。 src/user/user.module.ts import { Module } from "@nestjs/common"; import { UserService } from "./user.service"; import { UserController } f…
概要 以下でNestJSに入門したので、今度はデータベース操作ができるようになるまで掘り下げていきます。 takasehiromichiex.com データベース NestJSは、様々なORMを使用することができます。 MikroORM Sequelize Knex.js TypeORM Prisma または、データベー…
概要 今までブログも記事も書いたことがほとんどなかったので、試しに今まで気になっていたNestJSに入門する記事を書いてみました。 これは、公式サイトのOVERVIEWを網羅する範囲になります。 公式サイト docs.nestjs.com 記事一覧 その1 セットアップ、ディ…
前回 takasehiromichiex.com カスタムプロバイダを使用するケース カスタムプロバイダを使用するケースは、以下のようなものがあります。 Nestでクラスをインスタンス化する代わりにカスタムインスタンスを返す 2番目の依存関係で既存のクラスを再利用する …
前回 takasehiromichiex.com DIの基礎 依存性注入は、依存関係のインスタンス化を独自のコードで強制的に行うのではなく、IoCコンテナ、つまりNestJSランタイムシステムに移譲する制御の反転手法です。 まず、@Injectable()デコレータは、クラスをプロバイダ…
前回 takasehiromichiex.com デコレータ Nestは、デコレータを中心に構築されています。 デコレータは、@のプレフィックスをつけ、装飾するものの上に配置して適用します。 デコレータは、クラス、メソッド、プロパティにつけることができます。 パラメータ…
前回 takasehiromichiex.com nullを除外するインターセプタ null値が出現するたびに、空の文字列に変換するインターセプタを作成します。 $ nest g interceptor interceptor/excludeNull 以下のファイルが作成されました。 src/interceptor/exclude-null/exc…
前回 takasehiromichiex.com インターセプタのレスポンスマッピング handle()はObservableを返しますが、ストリームにはルートハンドラから返却された値が含まれているので、RxJSのmap()を使用して簡単に変更することができます。 新しいインターセプタを作…
前回 takasehiromichiex.com インターセプタ インターセプタは、@Injectable()デコレータがつけられたクラスで、NestInterceptorクラスを実装します。 インターセプタは、以下が可能です。 メソッド実行の前後に追加のロジックを実行する メソッドから返却さ…
前回 takasehiromichiex.com 実行コンテクスト canActivate()メソッドは、ExecutionContextインスタンスという1つの引数をとります。 ExecutionContextは、ArgumentsHostから継承します。 ArgumentsHostを拡張することで、ExecutionContextは、現在の実行プ…
前回 takasehiromichiex.com Guards ガードは、CanActivateインターフェースを実装する、@Injectable()デコレータがつけられたクラスです。 ガードの責任は、実行時に存在する特定の条件 (パーミッション、ロール、アクセスコントロールリストなど) に応じて…
前回 takasehiromichiex.com クラスバリデータを用いたパイプ Nestは、class-validatorライブラリと連携することができます。 このライブラリを使用すると、デコレータベースのバリデーションを使用できます。 ライブラリをインストールします。 $ npm insta…
前回 takasehiromichiex.com オブジェクトスキーマを検証するパイプ バリデーションの1つとして、スキーマベースのパイプを作成してみましょう。 joiライブラリを使用します。 $ npm install --save joi カスタムパイプを作成します。 $ nest g pipe pipe/Jo…