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

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

https://docs.nestjs.com/techniques/database

# -1- 準備編

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

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

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

```shell:プロジェクトに必要な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の情報を渡します。

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

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

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

# -2- 構築編

## -1- app.module.tsを編集

```typescript: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で作成
```shell:
nest g module users
nest g service users
nest g controller users
```
usersという名前のディレクトリがCLIによってsrcの中に作成されます。
ついでに、ルーティングのためのコントローラーとコントローラーから呼び出されて処理をするサービスも作成しておきます。

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

```typescript: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関係のみです。

```typescript: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を編集
```typescript: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を編集
```typescript: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- プロジェクト起動
```shell:
npm run start:dev
```
※devをつけるとファイルの変更をした場合に検知して、勝手に再実行してくれるので便利です。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/56139850-2b62-b401-9698-7850eee1bdf1.png)

## -3- RESTAPI確認
RESTAPIも正常に動作しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/62ef873e-5541-d6b7-6973-4495555ce998.png)

#まとめ
ここまでのソースはこちら

https://github.com/manoqiita/NestJS_TypeORM_tutorial

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

https://qiita.com/ms2geki/items/4bd3632020e1d0d4e1f4