NestJS 構築 からCRUD操作まで
NestJS
効率的なスケーラブルなNode.jsサーバーサイドアプリケーションを構築するためのフレームワーク
最近のJavaScriptで構築されており、TypeScriptを完全サポートしている。
- オブジェクト指向プログラミング
- 関数プログラミング
- リアクティブプログラミング
の組み合わせで構成される。
中身を見れば、Nestは(デフォルトでは)Expressのような堅牢なHTTPサーバーフレームワークを利用している。オプションでFastifyを使用する事もできる。
メリット
型の恩恵を得ることができる。
Expressの機能やライブラリを使うことができる。
Nest Cliを使ってプロジェクトやファイルのテンプレートを生成できる
テストフレームワークが標準で用意できる
拡張性が高い
データベース(RDB , NoSQL), セキュリティ, GraphQL , WebSocket , etc
デメリット
RoR, Laravel , Django などと比較すると利用ユーザーが少なく、情報が少ない。
環境構築
Node.js
初めにNode.jsをインストールします。
brewの方向け
brew install nodebrew
nodebrew -v
#versionが出ればOK
そしたら自分はstableでLTS版をインストールしました。
nodebrew install-binary stable
latestを使うと最新版がインストールできます
NestJS
いよいよNestJSをインストールします。
npm i -g @nestjs/cli
こちらでインストール終了です。
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のアーキテクチャはこのようになっています。
moduleの作成
こちらのコマンドでbooksモジュールを作成できます
nest g module books
controllerの作成
クライアントからのリクエストを受け付け、クライアントに、レスポンスを返す。
Controllerがルーティングの機能を担う
こちらのコマンドでbooksコントローラーを作成できます。
nest g controller books
上記のコマンドを実行すると
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