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项目。

美团外卖红包 饿了么红包 支付宝红包