Dev Study
← 解説「main.ts とブートストラップ」に戻る

サンプルコードで身につける: main.ts とブートストラップ

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1最小のmain.ts

ブートストラップの最小形です。NestFactory.create にルートモジュールを渡し、listen でポートを開くという2ステップがすべてで、どんな実務プロジェクトの main.ts もこの形の延長線上にあります。

import { NestFactory } from "@nestjs/core";
import { Module } from "@nestjs/common";

@Module({})
class AppModule {}

async function bootstrap() {
  // ① ルートモジュールを起点にアプリを組み立てる
  const app = await NestFactory.create(AppModule);
  // ② ポート 3000 で HTTP サーバーを起動する
  await app.listen(3000);
}
bootstrap();

2起動完了をログで確認する

listen の完了後にログを出して起動を確認できるようにした例です。app.getUrl() で実際の待ち受けURLが取れるため、実務では「起動したのにアクセスできない」を切り分ける最初の手がかりになります。

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
  // listen の解決後なら確実にサーバーは起動している
  console.log("起動完了: " + (await app.getUrl()));
}

// 起動に失敗したら理由を表示して異常終了させる
bootstrap().catch((err) => {
  console.error("起動失敗:", err);
  process.exit(1);
});

3ポート番号を環境変数で切り替える

ポートを process.env から読む例です。本番サーバーではポートが環境側から指定されることが多いため、「環境変数があればそれを使い、なければ開発用の既定値」という形が実務の定番です。

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

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

  // 環境変数は常に文字列なので数値に変換する
  // PORT が未設定なら開発用の 3000 にフォールバック
  const port = parseInt(process.env.PORT ?? "3000", 10);

  await app.listen(port);
  console.log("ポート " + port + " で待ち受け中");
}
bootstrap();

4全URLに /api プレフィックスを付ける

setGlobalPrefix でアプリ全体のURLの頭に /api を付ける例です。main.ts に1行足すだけで全ルートに効く「アプリ全体の設定は main.ts に書く」という方針の代表例で、フロントエンドと同居する構成でよく使います。

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

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

  // 全ルートの頭に /api が付く
  // 例: /users → /api/users
  app.setGlobalPrefix("api");

  await app.listen(3000);
}
bootstrap();
// 静的ファイル配信と API を1サーバーで同居させるときの定番設定

5フロントエンドからのアクセスを許可する(CORS)

enableCors で別ドメインのフロントエンドからのアクセスを許可する実務例です。React 開発サーバー(localhost:5173 など)から API を叩くと CORS エラーになる、という頻出トラブルの解決を main.ts で行います。

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

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

  // フロントエンド開発サーバーからのリクエストを許可
  app.enableCors({
    origin: "http://localhost:5173",
    credentials: true, // Cookie の送受信も許可
  });

  await app.listen(3000);
}
bootstrap();