mcpField
N
nestjs-best-practices

nestjs-best-practices

github.com/ejirocodes開発6448 回インストール19 週間前に更新
リポジトリ

nestjs-best-practices について

nestjs-best-practices は、NestJS 11 の開発者向けリファレンススキルです。アーキテクチャ、リクエスト処理、バリデーション、認証、データベース、テスト、マイクロサービスを扱い、よくあるミスや変更点も整理しています。

主な機能

  1. 01モジュール、プロバイダー、依存性注入を解説
  2. 02リクエストライフサイクルのパターンを参照
  3. 03DTO バリデーションと認証を紹介
  4. 04データベース連携とテストの指針を整理
  5. 05OpenAPI、GraphQL、マイクロサービスを網羅
  6. 06NestJS 11 の変更点とよくあるミスを掲載

活用シーン

  1. 01NestJS のモジュールとサービス構成を計画
  2. 02リクエスト検証と JWT 認証を実装
  3. 03データベース連携の設定とテスト作成
  4. 04循環依存や例外処理の問題を調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ejirocodes/agent-skills --skill nestjs-best-practices

インストール後、Claude Code で/nestjs-best-practicesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
authentication.md
core-architecture.md
database-integration.md
microservices.md
openapi-graphql.md
request-lifecycle.md
testing.md
validation-pipes.md

詳細

NestJS 11 のベストプラクティス

クイックリファレンス

トピック使用する場面リファレンス
コアアーキテクチャモジュール、プロバイダー、DI、forwardRef、カスタムデコレーターcore-architecture.md
リクエストのライフサイクルミドルウェア、ガード、インターセプター、パイプ、フィルターrequest-lifecycle.md
バリデーションとパイプDTO、class-validator、ValidationPipe、変換validation-pipes.md
認証JWT、Passport、ガード、ローカル/OAuth 戦略、RBACauthentication.md
データベースTypeORM、Prisma、Drizzle ORM、リポジトリパターンdatabase-integration.md
テスト単体テスト、E2E テスト、プロバイダーのモックtesting.md
OpenAPI と GraphQLSwagger デコレーター、リゾルバー、サブスクリプションopenapi-graphql.md
マイクロサービスTCP、Redis、NATS、Kafka のパターンmicroservices.md

基本パターン

プロバイダーを含むモジュール
@Module({
  imports: [DatabaseModule],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService], // Export for other modules
})
export class UsersModule {}
バリデーションを行うコントローラー
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }

  @Get(':id')
  findOne(@Param('id', ParseIntPipe) id: number) {
    return this.usersService.findOne(id);
  }
}
バリデーション付き DTO
import { IsEmail, IsString, MinLength, IsOptional } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  @MinLength(8)
  password: string;

  @IsOptional()
  @IsString()
  name?: string;
}
例外フィルター
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const status = exception.getStatus();

    response.status(status).json({
      statusCode: status,
      message: exception.message,
      timestamp: new Date().toISOString(),
    });
  }
}
JWT を使うガード
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    return super.canActivate(context);
  }
}

NestJS 11 の破壊的変更

  • Express v5:ワイルドカードには名前が必要です(例:*splat)。オプションのパラメーターには波括弧を使います /:file{.:ext}
  • Node.js 20+:必要な最小バージョンです
  • Fastify v5:Fastify ユーザー向けのアダプターが更新されました
  • 動的モジュール:同一の設定で同じモジュールを複数回インポートすると、別々のインスタンスになります

よくある間違い

  1. 循環依存で forwardRef() を使わない - 「cannot resolve dependency」エラーが発生します。forwardRef(() => ModuleName) でラップしてください
  2. HttpException ではなく通常のエラーをスローする - ステータスコードが失われ、例外フィルターが機能しなくなります。throw new BadRequestException('message') を使ってください
  3. @Injectable() デコレーターがない - プロバイダーを注入できません。サービスには必ずデコレーターを付けてください
  4. whitelist: true を指定せずにグローバル ValidationPipe を使う - 想定外のプロパティが許可されます。whitelist: true, forbidNonWhitelisted: true を設定してください
  5. プロバイダーをエクスポートせずにモジュールをインポートする - モジュール間でプロバイダーを共有するには exports 配列を使ってください
  6. ConfigModule.forRoot() を使わずに非同期設定を行う - ConfigService が未定義になります。AppModule に ConfigModule をインポートしてください
  7. overrideProvider() を使わずにテストする - 単体テストで実際のサービスが使われます。overrideProvider(Service).useValue(mock) で依存関係をモックしてください
  8. E2E テスト間でデータベースの状態を共有する - テスト間で分離されません。トランザクションを使うか、beforeEach でテーブルを空にしてください

コメント