🐰

NestJS 構築 からCRUD操作まで

2023/07/31に公開

NestJS

効率的なスケーラブルなNode.jsサーバーサイドアプリケーションを構築するためのフレームワーク

最近のJavaScriptで構築されており、TypeScriptを完全サポートしている。

  • オブジェクト指向プログラミング
  • 関数プログラミング
  • リアクティブプログラミング

の組み合わせで構成される。

中身を見れば、Nestは(デフォルトでは)Expressのような堅牢なHTTPサーバーフレームワークを利用している。オプションでFastifyを使用する事もできる。

メリット


型の恩恵を得ることができる。
Expressの機能やライブラリを使うことができる。
Nest Cliを使ってプロジェクトやファイルのテンプレートを生成できる
テストフレームワークが標準で用意できる
拡張性が高い
データベース(RDB , NoSQL), セキュリティ, GraphQL , WebSocket , etc

デメリット


RoR, Laravel , Django などと比較すると利用ユーザーが少なく、情報が少ない。

環境構築

Node.js

初めにNode.jsをインストールします。
https://nodejs.org/ja

brewの方向け

brew install nodebrew
nodebrew -v
#versionが出ればOK

そしたら自分はstableでLTS版をインストールしました。

nodebrew install-binary stable

latestを使うと最新版がインストールできます

NestJS

いよいよNestJSをインストールします。

npm i -g @nestjs/cli

こちらでインストール終了です。
https://docs.nestjs.com/

CRUD操作

環境構築が完了したら、CRUD操作に入っていきたいと思います。
各自PostManやり、curlなどの使い方などは調べてください。
こちらのコマンドでプロジェクトが作れます。
npm yarn pnpmはお好きにお任せ致します。

nest new project-name
Which package manager would you ❤️  to use? (Use arrow keys)
❯ npm 
  yarn 
  pnpm 

セットアップが完了したら実際にコードを書いていきたいのですが、
NestJSのアーキテクチャはこのようになっています。

参考文献
https://zenn.dev/higuchimakoto/articles/21c8420c4a612a

moduleの作成

こちらのコマンドでbooksモジュールを作成できます

nest g module books

https://docs.nestjs.com/modules

controllerの作成

クライアントからのリクエストを受け付け、クライアントに、レスポンスを返す。
Controllerがルーティングの機能を担う
こちらのコマンドでbooksコントローラーを作成できます。

nest g controller books

https://docs.nestjs.com/controllers
上記のコマンドを実行すると

import { Module } from '@nestjs/common';
import { BooksController } from './books.controller';

@Module({
  controllers: [BooksController]
})
export class BooksModule {}

先ほど作成したModuleの中身が書きかわりました。

serviceの作成

ビジネスロジックを定義する
Controllerから呼び出すことでユースケースも実現できる。

nest g service items --no-spec

--no-specをつけることでテストファイルを作成されずに作業できます。

modelの作成

本のモデルを作成します。
こちらは今までのようにコマンドがないので、実際にファイルに書いていきます。

export interfece Book{
isbn: string;
name: string:
price: number;
author: string;
}

これでモデルの作成が終わりました。

CURDの作成

controller

import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
} from '@nestjs/common';
import { book } from './book.model';
import { booksService } from './books.service';

@Controller('books')
export class booksController {
  constructor(private readonly booksService: booksService) {}

  @Get()
  findAll(): book[] {
    return this.booksService.findAll();
  }

  @Get(':id') // /books/id
  findById(@Param('id') id: string): book {
    return this.booksService.findById(id);
  }

  @Post()
  create(
    @Body('isbn') isbn: string,
    @Body('name') name: string,
    @Body('price') price: number,
    @Body('author') author: string,
  ): book {
    const book: book = {
      isbn,
      name,
      price,
      author,
    };

    return this.booksService.create(book);
  }

  @Patch(':id')
  updateStatus(@Param('id') id: string): book {
    return this.booksService.updateStatus(id);
  }

  @Delete(':id')
  delete(@Param('id') id: string): void {
    this.booksService.delete(id);
  }
}

serivce

import { Injectable } from '@nestjs/common';
import { book } from './book.model';

@Injectable()
export class booksService {
  private books: book[] = [];

  findAll(): book[] {
    return this.books;
  }

  findByisbn(isbn: string): book {
    return this.books.find((book) => book.isbn === isbn);
  }

  create(book: book): book {
    this.books.push(book);
    return book;
  }

  updateStatus(isbn: string): book {
    const book = this.findByisbn(isbn);
    return book;
  }

  delete(isbn: string): void {
    this.books = this.books.filter((book) => book.isbn !== isbn);
  }
}

こちらでCURDの作成を終えます。

npm run start 
or
yarn start

などで実行してGet,Put,Putch,Deleteメソッドがしっかりと機能するか試してみてください。

Discussion