見出し画像

【Node】DockerでNestJS+typeORM

前回作成したDockerのNodeコンテナに、NestJSとtypeORMを組み合わせたAPIを作成してみる。Docker環境の構築と使用するDBについては前回参照としてここでは触れない。

GitHubリポジトリはこちら


ディレクトリ構成

プロジェクトルート
├── app-nestjs (今回作るもの)
│   └── アプリケーション構成ファイル
├── app-next (前回作ったもの)
│   └── アプリケーション構成ファイル
├── mysql
│   ├── conf.d
│   │   └── my.cnf
│   └── init.d
│       └── データベースの初期化SQL
├── .env
├── .gitignore
├── docker-compose.yml
└── Dockerfile

手順

1. アプリケーション雛形の作成

Nodeコンテナに入りアプリケーションを置くディレクトリを作成、NestJSの雛形をGitHubから落としてきてインストールする。

# Nodeコンテナで実行
$ docker-compose exec node /bin/bash

# アプリケーションディレクトリ作成
$ mkdir app-nestjs
$ cd app-nestjs

# 雛形作成
$ git clone https://github.com/nestjs/typescript-starter.git ./
$ rm -rf .git
$ npm install

2. 動作確認

デバッグサーバーを起動し、Talend API TesterでAPIを叩いてみる。
http://localhost:3000/

$ npm run start:dev

お約束のご挨拶、シンプル。

3. パッケージインストール

次はtypeORMを動かす準備。必要なパッケージをインストール。

$ npm install mysql
$ npm install typeorm

# これは接続情報の秘匿用(必須ではない)
$ npm install dotenv

4. モデルの自動作成

今回は、DBのマイグレーションを使わず、すでに存在するDBに対してモデルをマッピングさせる。

typeorm-model-generatorパッケージを使い、既存のテーブルに対応したモデルを自動生成する。実行後、outputディレクトリが生成されているので、モデルが格納されているentitiesディレクトリをapp-nestjs/src配下に移動する。

# 自動生成を実行
$ npx typeorm-model-generator -h db -d DB名 -p 3306 -u ユーザー名 -x
パスワード -e mysql

# 生成されたディレクトリを移動
$ mv output/entities src/

# 出力ディレクトリはもういらない
$ rm -rf output

テーブル名は「books」など、複数形が一般的だが、自動生成するとモデルのクラス名が「Books」になってしまうのがちょっといただけない。もしかしたら、パラメータなどで回避する方法があるかもしれないが今回は生成した後に手動でなおしている。

5. データソースの作成

app-nestjs/src/data-source.tsを作成しデータソースを定義する。初期化も同時に行なってしまう。

import 'reflect-metadata';
import { DataSource } from 'typeorm';
import { Author } from './entities/Author';
import { Book } from './entities/Book';

// 環境変数
require('dotenv').config({path: '../.env'});

// データソース
export const AppDataSource = new DataSource({
  type: 'mysql',
  host: 'db',
  port: 3306,
  username: process.env.MYSQL_USER,
  password: process.env.MYSQL_PASSWORD,
  database: process.env.MYSQL_DATABASE,
  synchronize: false,
  logging: false,
  entities: [Author, Book]
});

// 初期化
AppDataSource.initialize().then(() => {
  console.log('DataSource has been initialized!')
}).catch((error) => console.log(error));

typeORMによるDBアクセスの準備はひとまず完了。

6. コントローラーの作成

NestJSコントローラーを作成する。書籍テーブルの全データを取得するAPIを想定。
app-nestjs/src/controllers/books.controller.ts

import { Controller, Get } from '@nestjs/common';
import { Book } from '../entities/Book';
import { AppDataSource } from 'src/data-source';

@Controller('books')
export class BooksController {
  @Get()
  async findAll(): Promise<Book[]> {
    const bookRepository = AppDataSource.getRepository(Book);
    const books = await bookRepository.find();
    console.log(books);
    return books;
  }
}

おお、これはらくちん。

7. コントローラーの登録

作成したコントローラーをAppModuleに登録する。
app-nestjs/src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { BooksController } from './controllers/books.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController, BooksController],
  providers: [AppService],
})
export class AppModule {}

8. 動作確認

デバッグサーバーを起動して、Talend API Testerで動作確認。
http://localhost:3000/books/

$ npm run start:dev

取得できているようだ、よしよし。

この記事が気に入ったらサポートをしてみませんか?