NestJsでサービスを作成し、データを操作する方法

NestJSでのサービスの作成とデータ操作について学びましょう。

概要

NestJSでは、サービスはビジネスロジックをカプセル化し、コントローラーとデータベースの間の橋渡しを行います。この記事では、NestJSでサービスを作成し、データを操作する方法を詳しく解説します。

nest.js v10.1.7
nodejs v19.7.0

また、今回作成するコードは全て、GitHubに掲載しています。

サービスを作成する方法

Nest.js には、Nest CLI という非常に便利なコマンドラインツールがあります。これを使用することで、サービスファイル・サービステストファイル・プロバイダーの登録を全て自動的に行うことができます。

以下のコマンドを実行すると、users ディレクトリにサービスファイルとサービステストファイルが追加されます。

nest g s users

実行すると users ディレクトリにサービスファイルとサービステストファイルが追加されます。

src/
└── users/
    ├── users.service.spec.ts
    └── users.service.ts

app.module.ts を確認してください。プロバイダーの登録も自動的に行われたことがわかります。

/src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersController } from './users/users.controller';
import { UsersService } from './users/users.service'; // CLI 実行時に自動登録

@Module({
imports: [],
controllers: [AppController, UsersController],
providers: [AppService, UsersService], // CLI 実行時に自動登録
})
export class AppModule {}

サービスの機能を作成する方法

次に、UsersServiceにデータ操作のロジックを実装します。ここでは、ユーザーのデータを保持する配列を作成し、ユーザーの取得、追加、削除のメソッドを実装します。

/src/users/users.service.ts

import { Injectable } from '@nestjs/common';

interface User {
  id: number;
  name: string;
}

@Injectable()
export class UsersService {
  private users: User[] = [
    { id: 1, name: 'John' },
    { id: 2, name: 'Jane' },
    { id: 3, name: 'Doe' },
  ];
  getUsers(): User[] {
    return this.users;
  }
  addUser(name: string): void {
    const newUser: User = {
      id: this.users.length + 1,
      name,
    };
    this.users.push(newUser);
  }
  putUser(id: number, name: string): void {
    const index = this.users.findIndex((user) => user.id === Number(id));
    if (index === -1) {
      console.error(`User with id ${id} not found.`);
      return;
    }
    console.log(`Updating user with id ${id} to have name ${name}`);
    this.users[index] = { ...this.users[index], name };
  }
  deleteUser(id: number): void {
    this.users = this.users.filter((user) => user.id !== Number(id));
  }
}

これで、UsersServiceはユーザーのデータを操作するロジックを持つようになりました。

コントローラーを修正する方法

最後に、UsersControllerを修正して、UsersServiceのメソッドを呼び出すようにします。

/src/users/users.controller.ts

import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
} from '@nestjs/common';
import { UsersService } from './users.service';

interface User {
  id: number;
  name: string;
}

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

  @Get()
  getUsers(): User[] {
    return this.usersService.getUsers();
  }
  @Post()
  addUser(@Body() name: string): void {
    this.usersService.addUser(name);
  }

  @Put(':id')
  putUser(@Param('id') id: number, @Body('name') name: string): void {
    this.usersService.putUser(id, name);
  }

  @Delete(':id')
  deleteUser(@Param('id') id: number): void {
    this.usersService.deleteUser(id);
  }
}


これで、UsersControllerはリクエストに応じてUsersServiceのメソッドを呼び出すようになりました。

テスト

# ユーザー一覧の取得
curl http://localhost:3000/users
# ユーザーの追加
curl -X POST -H "Content-Type: application/json" -d '{"name":"Mike"}' http://localhost:3000/users
# ユーザーの更新
curl -X PUT -H "Content-Type: application/json" -d '{"name": "Bob"}' http://localhost:3000/users/1
# ユーザーの削除
curl -X DELETE http://localhost:3000/users/4

まとめ

この記事では、NestJSでサービスを作成し、データを操作する方法を学びました。サービスは、ビジネスロジックをカプセル化し、コントローラーとデータベースの間の橋渡しを行います。NestJSのサービスは、アプリケーションのロジックを整理し、コードの再利用を促進します。