概要
以下でNestJSに入門したので、今度はデータベース操作ができるようになるまで掘り下げていきます。
データベース
NestJSは、様々なORMを使用することができます。
- MikroORM
- Sequelize
- Knex.js
- TypeORM
- Prisma
または、データベースに適切なNode.jsドライバをロードすることができます。
TypeORM統合
ライブラリをインストールします。
$ npm install --save @nestjs/typeorm typeorm mysql2
また、Docker Desktopをインストールしておきます。
その後、docker-compose.ymlを作成します。
docker-compose.yml
version: '3.9' services: mysql: image: mysql:latest restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test
ymlを設置したら、以下のコマンドを実行します。
$ docker-compose up -d
データベースコンテナが起動できたので、ルートモジュールに設定を投入します。
src/app.module.ts
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; import { AppController } from "./app.controller"; import { AppService } from "./app.service"; import { CatsController } from "./cats/cats.controller"; import { CatsModule } from "./cats/cats.module"; import { logger } from "./middleware/logger/logger.middleware"; @Module({ imports: [ CatsModule, TypeOrmModule.forRoot({ type: "mysql", host: "localhost", port: 3306, username: "root", password: "root", database: "test", entities: [], synchronize: true, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(logger).forRoutes(CatsController); } }
TypeOrmModule.forRoot
を追加しました。
リソースの作成
まず、リソースを作成します。
$ nest g resource user
? What transport layer do you use? REST API ? Would you like to generate CRUD entry points? Yes CREATE src/user/user.controller.spec.ts (556 bytes) CREATE src/user/user.controller.ts (883 bytes) CREATE src/user/user.module.ts (240 bytes) CREATE src/user/user.service.spec.ts (446 bytes) CREATE src/user/user.service.ts (607 bytes) CREATE src/user/dto/create-user.dto.ts (30 bytes) CREATE src/user/dto/update-user.dto.ts (169 bytes) CREATE src/user/entities/user.entity.ts (21 bytes) UPDATE package.json (2033 bytes) UPDATE src/app.module.ts (1073 bytes) ✔ Packages installed successfully.
以下のファイルが作成されました。
src/user/user.controller.spec.ts src/user/user.controller.ts src/user/user.module.ts src/user/user.service.spec.ts src/user/user.service.ts src/user/dto/create-user.dto.ts src/user/dto/update-user.dto.ts src/user/entities/user.entity.ts
エンティティを修正します。
src/user/entities/user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() firstName: string; @Column() lastName: string; @Column({ default: true }) isActive: boolean; }
さらに、ルートモジュールに追加で設定します。
src/app.module.ts
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; import { AppController } from "./app.controller"; import { AppService } from "./app.service"; import { CatsController } from "./cats/cats.controller"; import { CatsModule } from "./cats/cats.module"; import { logger } from "./middleware/logger/logger.middleware"; import { User } from "./user/entities/user.entity"; import { UserModule } from "./user/user.module"; @Module({ imports: [ TypeOrmModule.forRoot({ type: "mysql", host: "localhost", port: 3306, username: "root", password: "root", database: "test", entities: [User], synchronize: true, }), CatsModule, UserModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(logger).forRoutes(CatsController); } }
entities: [User]
に変更しました。
まとめ
ここまでで、
- NestJSで使用できるデータベース接続ライブラリについて
- TypeORM統合について
- リソースの作成について
を学びました。
次回も、データベース操作を掘り下げようと思います。
コード
今回のコードは、以下に格納しました。