高瀬博道の技術ブログ

高瀬博道の技術ブログです。

NestJS でデータベース操作できるようにする - 1

概要

以下でNestJSに入門したので、今度はデータベース操作ができるようになるまで掘り下げていきます。

takasehiromichiex.com

データベース

NestJSは、様々なORMを使用することができます。

  • MikroORM
  • Sequelize
  • Knex.js
  • TypeORM
  • Prisma

または、データベースに適切なNode.jsドライバをロードすることができます。

TypeORM統合

ライブラリをインストールします。

$ npm install --save @nestjs/typeorm typeorm mysql2

また、Docker Desktopをインストールしておきます。

www.docker.com

その後、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統合について
  • リソースの作成について

を学びました。

次回も、データベース操作を掘り下げようと思います。

コード

今回のコードは、以下に格納しました。

github.com

takasehiromichiex.com