【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
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
取得できているようだ、よしよし。
この記事が気に入ったらサポートをしてみませんか?