【Node.js】バックエンド用フレームワーク、NestJSに入門してみた

本投稿は TECOTEC Advent Calendar 2023 の17日目の記事です。

こんにちは、決済認証システム開発事業部の栗田と申します。

2023年2月に中途採用で入社させていただき、現在はLaravelを用いたバックエンドの開発に従事しています。
開発経験に乏しい私ですが、周囲の方々の手厚いサポートに支えられ、なんとか日々の業務に当たっております。

以前少しだけNode.js × TypeScriptを使用した開発業務に従事していた経験があり、その際気になっていたNode.jsのフレームワーク「NestJS」で環境構築を行ってみたいと思います。

※なお、私自身Node.jsとTypeScriptを使用した開発経験は浅く、NestJSについてもまだまだ勉強中の身ですので、記載に誤りがあった際はご容赦ください。。

目次

  • NestJSとは
  • Let's 環境構築
  • NestJSのファイル構造
  • まとめ

NestJSとは

まずはNestJSとはなんぞや、というお話から。 NestJSとはバックエンド開発用のNode.jsフレームワークです。

nestjs.com

特徴は下記になります。

  • デフォルトでTypeScriptがサポートされている
  • Expressをコアに作成されているので、Expressの機能やライブラリをそのまま使える
  • モジュール・サービス・コントローラの3つの概念で構成されている
  • デコレータ、DIがデフォルトで使える
  • Jest標準装備なのですぐテストできる

といった具合で、デフォルトで便利なライブラリが沢山入っているわけですね。 また、NestJS CLI(NestJSのCLIツール)を使用することで簡単に環境構築が行えるようです。

Let's 環境構築

では、早速環境構築を行ってみたいと思います。

まずは下記コマンドを実行して、NestJS CLI自体のインストールを行います。

$ npm i -g @nestjs/cli

次にアプリケーションのプロジェクトを作成します。

$ nest new <アプリケーション名>

今回のアプリケーション名はnestjs-sampleとします。 こんな具合にメッセージが表示されます。

⚡  We will scaffold your app in a few seconds..

? Which package manager would you ❤️  to use? npm
CREATE nestjs-sample/.eslintrc.js (663 bytes)
CREATE nestjs-sample/.prettierrc (51 bytes)
CREATE nestjs-sample/README.md (3340 bytes)
CREATE nestjs-sample/nest-cli.json (171 bytes)
CREATE nestjs-sample/package.json (1954 bytes)
CREATE nestjs-sample/tsconfig.build.json (97 bytes)
CREATE nestjs-sample/tsconfig.json (546 bytes)
CREATE nestjs-sample/src/app.controller.ts (274 bytes)
CREATE nestjs-sample/src/app.module.ts (249 bytes)
CREATE nestjs-sample/src/app.service.ts (142 bytes)
CREATE nestjs-sample/src/main.ts (208 bytes)
CREATE nestjs-sample/src/app.controller.spec.ts (617 bytes)
CREATE nestjs-sample/test/jest-e2e.json (183 bytes)
CREATE nestjs-sample/test/app.e2e-spec.ts (630 bytes)

✔ Installation in progress... ☕

🚀  Successfully created project nestjs-sample
👉  Get started with the following commands:

$ cd nestjs-sample
$ npm run start

                                         
                          Thanks for installing Nest 🙏
                 Please consider donating to our open collective
                        to help us maintain this package.
                                         
                                         
               🍷  Donate: https://opencollective.com/nest

順調ですね! メッセージに従いディレクトリを移動し、下記コマンドを実行してアプリケーションを起動してみます。

$ npm run start:dev

末尾に:devをつけることで、ホットリロードを有効にした状態でアプリケーションを起動できます。

無事起動しました!起動時のメッセージは下記になります。

[Nest] 30809  - 2023/12/08 19:31:36     LOG [NestFactory] Starting Nest application...
[Nest] 30809  - 2023/12/08 19:31:36     LOG [InstanceLoader] AppModule dependencies initialized +5ms
[Nest] 30809  - 2023/12/08 19:31:36     LOG [RoutesResolver] AppController {/}: +4ms
[Nest] 30809  - 2023/12/08 19:31:36     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 30809  - 2023/12/08 19:31:36     LOG [NestApplication] Nest application successfully started +1ms

あとはhttp://localhost:3000/にアクセスして、画面にHello World!が表示されればOKです。 非常に簡単に環境構築を行うことができました。

NestJSのファイル構成

ファイル構成について簡単に紹介していきます。 コアファイル構成はこちら。

src/
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts

デフォルトで作成される各種ファイルの中身と役割について見ていきます。

app.controller.spec.ts

コントローラーのユニットテスト用モジュールです。

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});
app.controller.ts

ルーティング機能を担います。 ルートハンドラとして機能し、リクエストに応じて特定のパスへ処理を実行します。

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}
app.module.ts

コントローラーやプロバイダーをまとめる役割を担います。 @Moduleデコレータを使用し、モジュールを定義します。

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
app.service.ts

ビジネスロジックを定義します。 @Injectableデコレータを使用してサービスを定義し、ルートに対するリクエストを処理します。

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}
main.ts

アプリケーションのエントリポイントになります。 ルートモジュールをインポートし、アプリケーションを起動します。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

まとめ

以上、NestJSの環境構築と簡単なご紹介でした。
本記事では紹介できませんでしたが、TypeORMの導入なども比較的簡単なようで、開発時の環境構築における工数も減らせるかもしれませんね。
いつか機会があれば業務でも使ってみたいです。

テコテックの採用活動について

テコテックでは新卒採用、中途採用共に積極的に募集をしています。 採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。 ご興味を持っていただけましたら是非ご覧ください。 tecotec.co.jp