NestJS+TypeORMでバックエンド構築 PART1 【インストール、RESTAPI実装】


大体公式ドキュメントの通りに実装していきます。

-1- 準備編

1.nestjsをインストールしてプロジェクトを作成します。

nestjsのインストールとプロジェクト作成
 npm i -g @nestjs/cli 
 nest new project-name

2.プロジェクトを開いて必要なパッケージをインストールします。

プロジェクトに必要なnpmパッケージをインストール
  npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata
  npm i --save @nestjs/typeorm typeorm mysql2

3. プロジェクトのルートディレクトリにormconfig.jsonを作成

後ほどER図の自動作成をしたいので、ormconfig.jsonを使ってDBの情報を渡します。

ormconfig.json
{
  "type": "mysql",
  "host": "localhost",
  "port": 3305,
  "username": "root",
  "password": "root",
  "database": "test",
  "entities": ["dist/**/*.entity{.ts,.js}"],
  "synchronize": true
}

4.mysqlのコンテナを3305番ポートで起動させます

3305番ポートでmysqlコンテナを起動
docker run -it \
-e MYSQL_DATABASE=test \
-e MYSQL_ROOT_PASSWORD=root \
-p 3305:3306 \
-d mysql


-2- 構築編

-1- app.module.tsを編集

app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import {TypeOrmModule} from "@nestjs/typeorm";
@Module({
  imports: [TypeOrmModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

-2- UsersModuleをCLIで作成

nest g module users
nest g service users
nest g controller users

usersという名前のディレクトリがCLIによってsrcの中に作成されます。
ついでに、ルーティングのためのコントローラーとコントローラーから呼び出されて処理をするサービスも作成しておきます。

-3- user.entity.tsを作成して編集

usersディレクトリの中にuser.entity.tsを作成します。こちらはCLIで作成することができないので、手動で作成してください。

user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  firstName: string;
  @Column()
  lastName: string;
  @Column({ default: true })
  isActive: boolean;
}

-4- users.module.tsを編集

CLIによって自動的にprovidersとcontrollerが追加されているので、編集が必要なのはTypeORM関係のみです。

users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User } from './user.entity';
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}

-5- users.service.tsを編集

users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
  findOne(id: string): Promise<User> {
    return this.usersRepository.findOne(id);
  }
  async remove(id: string): Promise<void> {
    await this.usersRepository.delete(id);
  }
}

-6- users.controller.tsを編集

users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
  findOne(id: string): Promise<User> {
    return this.usersRepository.findOne(id);
  }
  async remove(id: string): Promise<void> {
    await this.usersRepository.delete(id);
  }
}

-3- 確認編

ここまで終わったらあと一息です!

-1- プロジェクト起動

npm run start:dev

※devをつけるとファイルの変更をした場合に検知して、勝手に再実行してくれるので便利です。

-2- データベース確認

Workbenchでデータベースを確認すると、testデータベースの中にuserテーブルが出来ていることが確認できます。また、RESTAPIをテストするためにUserテーブルに適当にデータを入れておきます。

-3- RESTAPI確認

RESTAPIも正常に動作しています。

まとめ

ここまでのソースはこちら

part2でTypeORMのリレーションの実装とER図の自動作成を行います。