🙄

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

2021/01/03に公開

はじめに

本記事は、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