【NestJS/TypeORM/MySQL】CRUDを実装しよう

【NestJS/TypeORM/MySQL】CRUDを実装しよう

はじめに

コジマです。

【NestJS/TypeORM/MySQL】TypeORM CLIでテーブルを作ってみよう
でテーブルを作るところまでできたので、CRUDを作成してみようと思います。
CRUDとはなーに?な話はここでは割愛しますね。

予めテストデータを入れておきました。

やること

  1. dtoの作成
  2. controllerの作成
  3. serviceの作成
  4. 動作確認1:全件検索
  5. 動作確認2:ID検索
  6. 動作確認3:ユーザー登録
  7. 動作確認4:ユーザー更新
  8. 動作確認5:ユーザー削除

全件検索、ID検索、ユーザー登録、ユーザー更新、ユーザー削除
この5つのAPIを実装します。

dtoの作成

まずは、dtoを作成します。
リクエストだということを明示したいので、ファイル名はusers.request.tsとします。

users.request.ts

export class requestUserDto {
  firstName: string;
  lastName: string;
  age: number;
}

controllerの作成

users.controller.tsを作成します。
dtoというフォルダを作成して、その中に入れておきましょう。

users.controller.ts

import {
  Controller,
  Get,
  Post,
  Delete,
  Patch,
  Body,
  Param,
} from '@nestjs/common';
import { InsertResult, UpdateResult, DeleteResult } from 'typeorm';
import { UsersService } from './users.service';
import { Users } from '../entities/users.entity';
import { requestUserDto } from './dto/users.request';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  async getUsers(): Promise {
    return this.usersService.getUsers();
  }

  @Get(':id')
  async getUser(@Param('id') id: string): Promise {
    return this.usersService.getUser(Number(id));
  }

  @Post()
  async createUser(@Body() user: requestUserDto): Promise {
    return this.usersService.craeteUser(user);
  }

  @Patch(':id')
  async updateUser(
    @Param('id') id: string,
    @Body() user: requestUserDto,
  ): Promise {
    return this.usersService.updateUser(Number(id), user);
  }

  @Delete(':id')
  async deleteUser(@Param('id') id: string): Promise {
    return this.usersService.deleteUser(Number(id));
  }
}

serviceの作成

users.serivice.ts

import { Injectable } from '@nestjs/common';
import {
  getRepository,
  InsertResult,
  UpdateResult,
  DeleteResult,
} from 'typeorm';
import { Users } from '../entities/users.entity';
import { requestUserDto } from './dto/users.request';

@Injectable()
export class UsersService {
  async getUsers(): Promise {
    return getRepository(Users).find();
  }

  async getUser(userId: number): Promise {
    return getRepository(Users).find({ id: userId });
  }

  async craeteUser(user: requestUserDto): Promise {
    return getRepository(Users).insert(user);
  }

  async updateUser(
    userId: number,
    user: requestUserDto,
  ): Promise {
    return getRepository(Users).update(userId, user);
  }
  async deleteUser(userId: number): Promise {
    return getRepository(Users).delete({ id: userId });
  }
}

動作確認

dto, controller, serviceを作成したので動作確認しましょう。

npm run start:dev

でサーバーを起動します。

動作確認はThunder Clientを使ってAPIを飛ばして確認します。

1:全件検索

http://localhost:3000/users

にGETリクエストを投げてみます。

全件検索できました!。

2:ID検索

http://localhost:3000/users/1

にGETリクエストを投げてID=1のユーザーを取ってみます。


ID=1のユーザーを取得できました。

3:ユーザー登録

http://localhost:3000/users

にPOSTリクエストを投げてみます。

福田さんという人を追加してみます。
BODYはJSONで以下のように書きます。

{
    "firstName": "Yoshio",
    "lastName": "Fukuda",
    "age": 25
}



追加できましたね!

4:ユーザー更新

ところが福田さんはサバを読んでいて、実は28歳であることが分かりました。
年齢を更新しましょう。

http://localhost:3000/users/4

にPATCHリクエストを投げてみます。

BODYはJSONで以下のように書きます。

{
    "firstName": "Yoshio",
    "lastName": "Fukuda",
    "age": 28
}



福田さんの年齢を更新することができました。

5:ユーザー削除

ところが福田さんが年齢をサバ読んでいたことを気にかけて逃亡してしまいました。
削除することにします。

<

pre>http://localhost:3000/users/4/pre>
にDELETEリクエストを投げて福田さんを削除します。



無事に削除することができました。

さいごに

ここで書いた福田さんは超架空人物でほんとになにも関係ないです。
同姓同名でこの記事読んだ人いたらごめんなさい。

今回はRepositoryを使用してCRUDを実装しました。
公式ドキュメントは以下です。
https://github.com/typeorm/typeorm/blob/master/docs/repository-api.md

TypeORMではqueryBuilderを使うパターンやmanager.queryで生SQLを書くパターンなど
色々やり方がありますが、生SQLだと今流行りのSQLインジェクションのリスクもあるので、
RepositoryやqueryBuilderに頑張ってもらうのがよいと思います。

この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!

以上、コジマでした。


NestJSカテゴリの最新記事