NestJS + MySQL + TypeScriptプロジェクトの構築方法

本文では、NestJS + MySQL + TypeScriptプロジェクトをゼロから構築する方法について、開発者が迅速にプロジェクトを立ち上げ、自分のプロジェクトを構築する手助けをします。

プロジェクトの初期化

まず、Nest CLIをグローバルにインストールします:

Terminal window
1
npm install -g @nestjs/cli

次に、Nest CLIを使用して新しいプロジェクトを作成します:

Terminal window
1
nest new my-nestjs-project

npmまたはyarnをパッケージ管理ツールとして選択し、プロジェクトの初期化を完了します。

必要な依存関係のインストール

次に、プロジェクトディレクトリに移動し、必要な依存関係をインストールします:

Terminal window
1
cd my-nestjs-project
2
npm install --save @nestjs/typeorm typeorm mysql2
3
npm install --save-dev @types/mysql2

ここでは、@nestjs/typeormtypeormmysql2パッケージおよびその型定義ファイルをインストールします。

モジュール、コントローラ、サービスの作成

次に、Nest CLIを使用してユーザーモジュールを生成します:

Terminal window
1
nest generate module users
2
nest generate controller users
3
nest generate service users

Userエンティティを作成し、src/users/user.entity.tsに以下の内容を追加します:

1
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
2
3
@Entity()
4
export class User {
5
@PrimaryGeneratedColumn()
6
id: number;
7
8
@Column()
9
name: string;
10
11
@Column()
12
email: string;
13
}

src/users/users.module.tsでUserエンティティをインポートします:

1
import { Module } from "@nestjs/common";
2
import { TypeOrmModule } from "@nestjs/typeorm";
3
import { UsersService } from "./users.service";
4
import { UsersController } from "./users.controller";
5
import { User } from "./user.entity";
6
7
@Module({
8
imports: [TypeOrmModule.forFeature([User])],
9
providers: [UsersService],
10
controllers: [UsersController],
11
})
12
export class UsersModule {}

CRUD操作の実装

src/users/users.service.tsでCRUD操作を実装します:

1
import { Injectable } from "@nestjs/common";
2
import { InjectRepository } from "@nestjs/typeorm";
3
import { Repository } from "typeorm";
4
import { User } from "./user.entity";
5
6
@Injectable()
7
export class UsersService {
8
constructor(
9
@InjectRepository(User)
10
private usersRepository: Repository<User>,
11
) {}
12
13
findAll(): Promise<User[]> {
14
return this.usersRepository.find();
15
}
16
17
findOne(id: number): Promise<User> {
18
return this.usersRepository.findOneBy({ id });
19
}
20
21
create(user: User): Promise<User> {
22
return this.usersRepository.save(user);
23
}
24
25
async update(id: number, user: User): Promise<void> {
26
await this.usersRepository.update(id, user);
27
}
28
29
async remove(id: number): Promise<void> {
30
await this.usersRepository.delete(id);
31
}
32
}

src/users/users.controller.tsでルートを定義します:

1
import {
2
Controller,
3
Get,
4
Post,
5
Body,
6
Param,
7
Delete,
8
Put,
9
} from "@nestjs/common";
10
import { UsersService } from "./users.service";
11
import { User } from "./user.entity";
12
13
@Controller("users")
14
export class UsersController {
15
constructor(private readonly usersService: UsersService) {}
16
17
@Get()
18
findAll(): Promise<User[]> {
19
return this.usersService.findAll();
20
}
21
22
@Get(":id")
23
findOne(@Param("id") id: number): Promise<User> {
24
return this.usersService.findOne(id);
25
}
26
27
@Post()
28
create(@Body() user: User): Promise<User> {
29
return this.usersService.create(user);
30
}
31
32
@Put(":id")
33
update(@Param("id") id: number, @Body() user: User): Promise<void> {
34
return this.usersService.update(id, user);
35
}
36
37
@Delete(":id")
38
remove(@Param("id") id: number): Promise<void> {
39
return this.usersService.remove(id);
40
}
41
}

次に、src/app.module.tsでTypeORMモジュールを設定します:

1
import { Module } from "@nestjs/common";
2
import { TypeOrmModule } from "@nestjs/typeorm";
3
import { AppController } from "./app.controller";
4
import { AppService } from "./app.service";
5
import { UsersModule } from "./users/users.module";
6
import { User } from "./users/user.entity";
7
8
@Module({
9
imports: [
10
TypeOrmModule.forRoot({
11
type: "mysql",
12
host: "localhost",
13
port: 3306,
14
username: "root",
15
password: "password",
16
database: "test",
17
entities: [User],
18
synchronize: true,
19
}),
20
UsersModule,
21
],
22
controllers: [AppController],
23
providers: [AppService],
24
})
25
export class AppModule {}

注意:synchronizeは本番環境ではfalseに設定することを推奨します。さもないと、データが失われるリスクがあります。

プロジェクトディレクトリ構造

プロジェクトのディレクトリ構造は次のようになります:

1
my-nestjs-project
2
├── src
3
│ ├── app.controller.ts
4
│ ├── app.module.ts
5
│ ├── app.service.ts
6
│ ├── main.ts
7
│ └── users
8
│ ├── user.entity.ts
9
│ ├── users.controller.ts
10
│ ├── users.module.ts
11
│ └── users.service.ts
12
├── test
13
├── .gitignore
14
├── nest-cli.json
15
├── ormconfig.json
16
├── package.json
17
├── README.md
18
├── tsconfig.build.json
19
└── tsconfig.json

プロジェクトの起動

以下のコマンドを使用してプロジェクトを起動します:

Terminal window
1
npm run start

デフォルトでは、NestJSプロジェクトはhttp://localhost:3000で実行されます。このアドレスにアクセスし、Postmanや他のツールを使用してAPIエンドポイントをテストできます。

まとめ

本文では、NestJS + MySQL + TypeScriptプロジェクトをゼロから構築する方法について、プロジェクトの初期化、依存関係のインストール、TypeORMの設定、モジュールの作成、CRUD操作の実装などの手順を詳細に紹介しました。