🙄

NestJS入門~NestJSの基本構造を理解しよう~

2021/01/03に公開1

はじめに

本記事は、NestJSというNode.jsのフレームワークの紹介となります。
対象読者にあたる方は、是非ご覧下さい!
認識誤っている箇所等あれば、コメントもいただけると嬉しいです!!

対象読者

  • Node.jsでWeb APIたてたいと思ってる方
  • NestJS触ってみたかったけど、まだ触ってない方
  • なんか新しいフレームワーク学びたいなと思っている方

注意

  • Node.js は10.13.0以上が必要です

What is NestJS

まずは、NestJSとはなんぞや、という話からです。

以下、公式ページより抜粋してみました。

  • Node.js サーバーサイドアプリケーションを構築するためのフレームワーク
  • TypeScriptをdefaultでサポート ( also supports pure Javascript)
  • Expressをより抽象化したもの(Fastifyも使用可能)

Features

特徴も公式ページより抜粋しますね。

TypeScriptでかけて、アーキテクチャもしっかりしていて、拡張性が非常に高いんです!

  • テストしやすい
  • 拡張性高い
  • 疎結合
  • メンテしやすい
  • アーキテクチャはAngularに強く影響

Hands On

ここからは実際にNestJSを触っていきましょう!

Installation

普段お使いのターミナルを開いて、まずはCLIのインストールです。

npm i -g @nestjs/cli

続いて適当なアプリを作成します。

# project-nameの部分を任意に指定 
nest new project-name

サーバの起動

それではサーバを立ち上げましょう!

# project-nameは先ほど入力した文字列に変換ください
cd project-name
npm run start:dev

確認

http://localhost:3000/ にアクセスし、Hello worldが表示されていれば成功です!


基本構造

ここからは実際のソースコードを見ていきます。

NestJSを動かす上で重要なのが下記4つのファイルたちです。一つずつ見ていきましょう。

  • main
  • controller
  • provider
  • module

main.ts

  • nestjsのエントリーポイント
  • ここでサーバのインスタンスを作成し、listenする
async function bootstrap() {
	// expressでいう const app = express();
	// create()の引数にはルートモジュールクラスを指定する
	const app = await NestFactory.create(AppModule);
	// 3000番ポートでサーバの起動
	await app.listen(3000);
}
bootstrap();

contoroller.ts

  • ルーティングする場所
// @Controller()の引数にルーティングのパスを指定する
// @Controller()は '/'へのパス。 @Controller('todos')は '/todos' へのパス
@Controller()
export class AppController {
	// service.tsで宣言したクラスをDIしてる。
	constructor(private readonly appService: AppService) {}

	// Getメソッドの場合はここでキャッチされる。
	// @Get()の引数でもパス指定が可能。@Controller()で指定した後に続く部分のパスを指定する。
	@Get()
	// メソッド名はなんでも良い。
	getHello(): string {
		// 処理の内容はcontrollerには書かずにprovider(service.ts)に記述する。
		return this.appService.getHello();
	}
}

service.ts

  • Nestjsでいうところのproviderのひとつ
  • DI(依存関係を注入)するものを記述
// このデコレータでproviderとして認識される。
// そして、controllerのconstructorからDIされる。
@Injectable()
export class AppService {
	// メソッド名はなんでも良い。controllerで指定した名前と違っても良い。(同じにした方がわかりやすい)
	getHello(): string {
		return 'Hello World!';
	}
}

module.ts

  • controllerとかproviderを取りまとめるところ(依存関係の解決)
  • 必ず1つ以上のmodule.tsが必要(ルートモジュール)
// このアプリのルートモジュール
// importsの配列の中に他のmoduleを入れると別のmoduleをimportすることが可能。
@Module({
	imports: [],
	controllers: [AppController],
	providers: [AppService],
})
export class AppModule {}

その他便利なfeature

他にも強力な機能がたくさんあるので、いずれ紹介していきたいなと思ってます。

  • Exception filters
    • built-inで例外処理のレイヤーがある
  • Pipes
    • データの変換とvalidationが可能
  • Guards
    • 認可(authorization)

まとめ

以上、NestJSについて見ていきましたが、いかがでしたでしょうか。

まだ日本での活用事例が少ないせいか、日本語での情報が少ないのが現状です。

ですが、この記事をきっかけにNestJSユーザーが増えて、日本でのコミュニティが活発になれば良いなと思ってます。

最後まで読んでいただきありがとうございました!

サンプルコード

記事で紹介したコードの全体は下記よりご確認いただけます。

Discussion

MeguriMeguri

NestJSの特徴や、公式のアーキテクチャに基づく設計方法についての説明がとてもわかりやすいです。TypeScriptの利用やDI(依存性注入)を駆使したアーキテクチャ、また、NestJSがExpressの抽象化を行っている点もポイントとしてしっかり触れられていて、実際に手を動かしながら学べる構成に感心しました。ありがとうございます。