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 {}

在上面的例子中,AppModule導入了UsersModuleProductsModule,使它們成為應用程序的一部分。

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)是NestJS中用於處理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路徑的三個路由:GET /usersGET /users/:idPOST /users

services

服務(Services)是NestJS中用於處理業務邏輯的類。服務通常會被注入到控制器中,以處理請求並返回數據。

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
}

在上面的例子中,UsersService使用TypeORM處理User實體的CRUD操作,並提供了findAllfindOnecreate方法。

modules

模塊(Modules)是NestJS中用於組織應用程序結構的類。每個模塊可以包含多個控制器和服務,並且可以導入其他模塊。

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 {}

在上面的例子中,UsersModule導入了TypeOrmModule並註冊了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 {}

ProductsService中使用UsersService

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.tscontrollersservicesmodules,並通過實際案例說明了多個模塊之間如何協作。通過合理組織和使用這些文件和目錄,可以構建高效、可維護的NestJS項目。