NestJSプロジェクトのsrcディレクトリの主要ファイルとディレクトリの役割解説
- 1134単語
- 6分
- 07 Jul, 2024
NestJSプロジェクトのディレクトリ構造は明確で、拡張性があります。実際の開発において、各ファイルとディレクトリの役割を理解し適切に使用することは、効率的で保守性の高いプロジェクトを構築するために重要です。本文では、NestJSプロジェクトのsrc
ディレクトリ内の主要ファイルとディレクトリの役割について詳しく説明し、複数のモジュール間の協力方法を実例で紹介します。
app.module.ts
app.module.ts
ファイルは、NestJSアプリケーションのルートモジュールです。アプリケーションの主要な構造と依存関係を定義します。すべてのモジュール、コントローラー、サービスはルートモジュールを通じて登録および管理されます。
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { ConfigModule } from "@nestjs/config";4import { UsersModule } from "./users/users.module";5import { ProductsModule } from "./products/products.module";6
7@Module({8 imports: [9 ConfigModule.forRoot(),10 TypeOrmModule.forRoot(),11 UsersModule,12 ProductsModule,13 ],14 controllers: [],15 providers: [],16})17export class AppModule {}
上の例では、AppModule
はUsersModule
とProductsModule
をインポートし、それらをアプリケーションの一部としています。
main.ts
main.ts
ファイルは、NestJSアプリケーションのエントリーポイントです。アプリケーションの起動とNestJSのHTTPサーバーの開始を担当します。
1import { NestFactory } from "@nestjs/core";2import { AppModule } from "./app.module";3
4async function bootstrap() {5 const app = await NestFactory.create(AppModule);6 await app.listen(3000);7}8bootstrap();
上の例では、main.ts
ファイルはNestFactory
を使用してAppModule
に基づくNestJSアプリケーションを作成し、3000
ポートでリッスンさせています。
controllers
コントローラー(Controllers)は、HTTPリクエストを処理するためのクラスです。各コントローラーは、異なるリクエストパスとメソッドに対応する一連のルートを定義します。
1import { Controller, Get, Post, Body, Param } from "@nestjs/common";2import { UsersService } from "./users.service";3import { CreateUserDto } from "./dto/create-user.dto";4
5@Controller("users")6export class UsersController {7 constructor(private readonly usersService: UsersService) {}8
9 @Get()10 findAll() {11 return this.usersService.findAll();12 }13
14 @Get(":id")15 findOne(@Param("id") id: string) {16 return this.usersService.findOne(+id);17 }18
19 @Post()20 create(@Body() createUserDto: CreateUserDto) {21 return this.usersService.create(createUserDto);22 }23}
上の例では、UsersController
は/users
パスに対する3つのルートを定義しています:GET /users
、GET /users/:id
、およびPOST /users
。
services
サービス(Services)は、ビジネスロジックを処理するためのクラスです。サービスは通常、コントローラーに注入され、リクエストを処理してデータを返します。
1import { Injectable } from "@nestjs/common";2import { User } from "./user.entity";3import { InjectRepository } from "@nestjs/typeorm";4import { Repository } from "typeorm";5import { CreateUserDto } from "./dto/create-user.dto";6
7@Injectable()8export class UsersService {9 constructor(10 @InjectRepository(User)11 private usersRepository: Repository<User>,12 ) {}13
14 findAll(): Promise<User[]> {15 return this.usersRepository.find();16 }17
18 findOne(id: number): Promise<User> {19 return this.usersRepository.findOneBy({ id });20 }21
22 create(createUserDto: CreateUserDto): Promise<User> {23 const user = this.usersRepository.create(createUserDto);24 return this.usersRepository.save(user);25 }26}
上の例では、UsersService
はTypeORM
を使用してUser
エンティティのCRUD操作を処理し、findAll
、findOne
、およびcreate
メソッドを提供しています。
modules
モジュール(Modules)は、アプリケーションの構造を整理するためのクラスです。各モジュールには複数のコントローラーとサービスを含めることができ、他のモジュールをインポートすることもできます。
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { UsersController } from "./users.controller";4import { UsersService } from "./users.service";5import { User } from "./user.entity";6
7@Module({8 imports: [TypeOrmModule.forFeature([User])],9 controllers: [UsersController],10 providers: [UsersService],11})12export class UsersModule {}
上の例では、UsersModule
はTypeOrmModule
をインポートし、User
エンティティを登録します。また、UsersController
とUsersService
を定義しています。
複数のモジュール間の協力
実際のプロジェクトでは、複数のモジュールが協力する必要があります。ここでは、UsersModule
とProductsModule
を例にとり、あるモジュールで他のモジュールのサービスを使用する方法を説明します。
まず、ProductsModule
を作成します:
1nest generate module products2nest generate controller products3nest generate service products
Product
エンティティを定義します:
1import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";2
3@Entity()4export class Product {5 @PrimaryGeneratedColumn()6 id: number;7
8 @Column()9 name: string;10
11 @Column()12 price: number;13}
ProductsModule
を設定します:
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { ProductsController } from "./products.controller";4import { ProductsService } from "./products.service";5import { Product } from "./product.entity";6import { UsersModule } from "../users/users.module"; // UsersModuleをインポート7
8@Module({9 imports: [TypeOrmModule.forFeature([Product]), UsersModule], // UsersModuleをインポート10 controllers: [ProductsController],11 providers: [ProductsService],12})13export class ProductsModule {}
ProductsService
でUsersService
を使用します:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { Product } from "./product.entity";5import { UsersService } from "../users/users.service"; // UsersServiceをインポート6
7@Injectable()8export class ProductsService {9 constructor(10 @InjectRepository(Product)11 private productsRepository: Repository<Product>,12 private usersService: UsersService, // UsersServiceを注入13 ) {}14
15 findAll(): Promise<Product[]> {16 return this.productsRepository.find();17 }18
19 findOne(id: number): Promise<Product> {20 return this.productsRepository.findOneBy({ id });21 }22
23 async create(name: string, price: number): Promise<Product> {24 const user = await this.usersService.findOne(1); // UsersServiceを使用25 if (user) {26 const product = this.productsRepository.create({ name, price });27 return this.productsRepository.save(product);28 }29 return null;30 }31}
上の例では、ProductsService
はコンストラクタを通じてUsersService
を注入し、create
メソッドでUsersService
のメソッドを使用しています。
まとめ
本文では、NestJSプロジェクトのsrc
ディレクトリ内の主要ファイルとディレクトリの役割について詳しく説明し、app.module.ts
、main.ts
、controllers
、services
、およびmodules
をカバーしました。また、複数のモジュール間の協力方法を実例で紹介しました。これらのファイルとディレクトリを適切に整理および使用することで、効率的で保守性の高いNestJSプロジェクトを構築できます。