NestJSプロジェクトのsrcディレクトリの主要ファイルとディレクトリの役割解説

NestJSプロジェクトのディレクトリ構造は明確で、拡張性があります。実際の開発において、各ファイルとディレクトリの役割を理解し適切に使用することは、効率的で保守性の高いプロジェクトを構築するために重要です。本文では、NestJSプロジェクトのsrcディレクトリ内の主要ファイルとディレクトリの役割について詳しく説明し、複数のモジュール間の協力方法を実例で紹介します。

app.module.ts

app.module.tsファイルは、NestJSアプリケーションのルートモジュールです。アプリケーションの主要な構造と依存関係を定義します。すべてのモジュール、コントローラー、サービスはルートモジュールを通じて登録および管理されます。

1
import { Module } from "@nestjs/common";
2
import { TypeOrmModule } from "@nestjs/typeorm";
3
import { ConfigModule } from "@nestjs/config";
4
import { UsersModule } from "./users/users.module";
5
import { 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
})
17
export class AppModule {}

上の例では、AppModuleUsersModuleProductsModuleをインポートし、それらをアプリケーションの一部としています。

main.ts

main.tsファイルは、NestJSアプリケーションのエントリーポイントです。アプリケーションの起動とNestJSのHTTPサーバーの開始を担当します。

1
import { NestFactory } from "@nestjs/core";
2
import { AppModule } from "./app.module";
3
4
async function bootstrap() {
5
const app = await NestFactory.create(AppModule);
6
await app.listen(3000);
7
}
8
bootstrap();

上の例では、main.tsファイルはNestFactoryを使用してAppModuleに基づくNestJSアプリケーションを作成し、3000ポートでリッスンさせています。

controllers

コントローラー(Controllers)は、HTTPリクエストを処理するためのクラスです。各コントローラーは、異なるリクエストパスとメソッドに対応する一連のルートを定義します。

1
import { Controller, Get, Post, Body, Param } from "@nestjs/common";
2
import { UsersService } from "./users.service";
3
import { CreateUserDto } from "./dto/create-user.dto";
4
5
@Controller("users")
6
export 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 /usersGET /users/:id、およびPOST /users

services

サービス(Services)は、ビジネスロジックを処理するためのクラスです。サービスは通常、コントローラーに注入され、リクエストを処理してデータを返します。

1
import { Injectable } from "@nestjs/common";
2
import { User } from "./user.entity";
3
import { InjectRepository } from "@nestjs/typeorm";
4
import { Repository } from "typeorm";
5
import { CreateUserDto } from "./dto/create-user.dto";
6
7
@Injectable()
8
export 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
}

上の例では、UsersServiceTypeORMを使用してUserエンティティのCRUD操作を処理し、findAllfindOne、およびcreateメソッドを提供しています。

modules

モジュール(Modules)は、アプリケーションの構造を整理するためのクラスです。各モジュールには複数のコントローラーとサービスを含めることができ、他のモジュールをインポートすることもできます。

1
import { Module } from "@nestjs/common";
2
import { TypeOrmModule } from "@nestjs/typeorm";
3
import { UsersController } from "./users.controller";
4
import { UsersService } from "./users.service";
5
import { User } from "./user.entity";
6
7
@Module({
8
imports: [TypeOrmModule.forFeature([User])],
9
controllers: [UsersController],
10
providers: [UsersService],
11
})
12
export class UsersModule {}

上の例では、UsersModuleTypeOrmModuleをインポートし、Userエンティティを登録します。また、UsersControllerUsersServiceを定義しています。

複数のモジュール間の協力

実際のプロジェクトでは、複数のモジュールが協力する必要があります。ここでは、UsersModuleProductsModuleを例にとり、あるモジュールで他のモジュールのサービスを使用する方法を説明します。

まず、ProductsModuleを作成します:

Terminal window
1
nest generate module products
2
nest generate controller products
3
nest generate service products

Productエンティティを定義します:

1
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
2
3
@Entity()
4
export class Product {
5
@PrimaryGeneratedColumn()
6
id: number;
7
8
@Column()
9
name: string;
10
11
@Column()
12
price: number;
13
}

ProductsModuleを設定します:

1
import { Module } from "@nestjs/common";
2
import { TypeOrmModule } from "@nestjs/typeorm";
3
import { ProductsController } from "./products.controller";
4
import { ProductsService } from "./products.service";
5
import { Product } from "./product.entity";
6
import { UsersModule } from "../users/users.module"; // UsersModuleをインポート
7
8
@Module({
9
imports: [TypeOrmModule.forFeature([Product]), UsersModule], // UsersModuleをインポート
10
controllers: [ProductsController],
11
providers: [ProductsService],
12
})
13
export class ProductsModule {}

ProductsServiceUsersServiceを使用します:

1
import { Injectable } from "@nestjs/common";
2
import { InjectRepository } from "@nestjs/typeorm";
3
import { Repository } from "typeorm";
4
import { Product } from "./product.entity";
5
import { UsersService } from "../users/users.service"; // UsersServiceをインポート
6
7
@Injectable()
8
export 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.tsmain.tscontrollersservices、およびmodulesをカバーしました。また、複数のモジュール間の協力方法を実例で紹介しました。これらのファイルとディレクトリを適切に整理および使用することで、効率的で保守性の高いNestJSプロジェクトを構築できます。