【NestJS/TypeORM/MySQL】DBに接続してデータを取得する

【NestJS/TypeORM/MySQL】DBに接続してデータを取得する

はじめに

コジマです。

プロジェクト作ってDB構築したので接続してみる
【NestJS】プロジェクトを作成してみる
【Docker】docker-composeでMySQL環境を作ろう

やること

  1. テスト用のテーブルとデータ入れる
  2. userコントローラ一式をつくる
  3. DB接続設定をする
  4. 突っ込んだユーザを取得する

テスト用のテーブルとデータ入れる

簡単にSQLでこしらえることにしました。
テーブル作成

CREATE TABLE user (
  id int NOT NULL AUTO_INCREMENT,
  firstName varchar(255) NOT NULL,
  lastName varchar(255) NOT NULL,
  age int NOT NULL,
  PRIMARY KEY (`id`)
)

ユーザを登録

INSERT INTO user VALUES(1, 'Taro', 'Tanaka', 30);

userコントローラ一式をつくる

cliでつくっていきまっしょい

nest g module user
nest g controller user
nest g service user

src/userの下に

user.controller.spec.ts
user.controller.ts
user.module.ts
user.service.spec.ts
user.service.ts

ができていればOK

今のままだとapp.module.tsにuser系のもの全部インポートされるので、
user.module.tsにuser系のものは集約しましょう。

app.module.ts

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

user/user.module.ts

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
  imports: [UserModule],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

DB接続設定をする

このままだとTypeORM使えないのでまずはTypeORM一式をインストールしましょう。

npm install --save @nestjs/typeorm typeorm mysql

NestJS用のTypeORMとTypeORMとMySQLのドライバだよって思ってくれれば大丈夫です。

app.module.tsでTypeORM用の設定をして、entityを作ります。
app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'my-secret-pw',
      database: 'mydb',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

entity/user.entity.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  age: number;
}

そしたらコントローラとサービスを作っていきましょう。
user/user.controller.ts

import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  getUsers(): any {
    return this.userService.getUsers();
  }
}

user/user.service.ts

import { Injectable } from '@nestjs/common';
import { getRepository } from 'typeorm';
import { User } from '../entity/user.entity';

@Injectable()
export class UserService {
  getUsers(): Promise {
    return getRepository(User).find();
  }
}

ユーザ一式取ってくるコントローラを作ってみました。
今は最初に追加したTanaka Taroさんがとれるはず。

戻り値の型anyで逃げてしまったのは今は許してほしい。。。

突っ込んだユーザを取得する

実際にとれるか試していきましょう。
開発モードでnodeを実行します。

npm run start:dev

localhost:3000/user でとってこれたらOKです。
postmanとかcurlコマンドがセオリー化と思いますが、Thunder ClientというVSCodeの拡張機能を使っていきます。


このようにとることができました!やったね!

さいごに

CRUD実装して~とかまだまだ入り口にすぎないのでもっといろいろ触って覚えないとですね。

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

以上、コジマでした。


NestJSカテゴリの最新記事