模块
模块是用 @Module() 装饰器注释的类。每个应用至少有一个模块,一个 根模块。
用法举例说明:
创建两个模块,一个叫 phone,一个叫 user。
需求:在 User 模块中,使用 Phone 模块中的服务
1、共享模块
ts
import { Module } from "@nestjs/common";
import { PhoneService } from "./phone.service";
import { PhoneController } from "./phone.controller";
@Module({
controllers: [PhoneController],
providers: [PhoneService],
// 导出 providers,供其他模块使用
exports: [PhoneService],
})
export class PhoneModule {}
import { Module } from "@nestjs/common";
import { PhoneService } from "./phone.service";
import { PhoneController } from "./phone.controller";
@Module({
controllers: [PhoneController],
providers: [PhoneService],
// 导出 providers,供其他模块使用
exports: [PhoneService],
})
export class PhoneModule {}
ts
import { Injectable } from "@nestjs/common";
@Injectable()
export class PhoneService {
async getAllPhones() {
return [
{
id: 1,
name: "iPhone 12",
price: 12000,
description: "Awesome phone",
category: "smartphone",
},
];
}
}
import { Injectable } from "@nestjs/common";
@Injectable()
export class PhoneService {
async getAllPhones() {
return [
{
id: 1,
name: "iPhone 12",
price: 12000,
description: "Awesome phone",
category: "smartphone",
},
];
}
}
ts
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
import { PhoneModule } from "../phone/phone.module";
@Module({
// 导入 phone 模块
imports: [PhoneModule],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
import { PhoneModule } from "../phone/phone.module";
@Module({
// 导入 phone 模块
imports: [PhoneModule],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
ts
import { Controller, Get } from "@nestjs/common";
import { PhoneService } from "../phone/phone.service";
@Controller("user")
export class UserController {
constructor(private readonly phoneService: PhoneService) {}
@Get("phone")
async getUserPhone() {
// 在 user 模块中,使用 phone 模块中的 PhoneService
const phone = await this.phoneService.getAllPhones();
return phone;
}
}
import { Controller, Get } from "@nestjs/common";
import { PhoneService } from "../phone/phone.service";
@Controller("user")
export class UserController {
constructor(private readonly phoneService: PhoneService) {}
@Get("phone")
async getUserPhone() {
// 在 user 模块中,使用 phone 模块中的 PhoneService
const phone = await this.phoneService.getAllPhones();
return phone;
}
}
2、全局模块
ts
import { Module, Global } from "@nestjs/common";
import { PhoneService } from "./phone.service";
import { PhoneController } from "./phone.controller";
@Global()
@Module({
controllers: [PhoneController],
providers: [PhoneService],
exports: [PhoneService],
})
export class PhoneModule {}
import { Module, Global } from "@nestjs/common";
import { PhoneService } from "./phone.service";
import { PhoneController } from "./phone.controller";
@Global()
@Module({
controllers: [PhoneController],
providers: [PhoneService],
exports: [PhoneService],
})
export class PhoneModule {}
ts
import { Injectable } from "@nestjs/common";
@Injectable()
export class PhoneService {
async getAllPhones() {
return [
{
id: 1,
name: "iPhone 12",
price: 12000,
description: "Awesome phone",
category: "smartphone",
},
];
}
}
import { Injectable } from "@nestjs/common";
@Injectable()
export class PhoneService {
async getAllPhones() {
return [
{
id: 1,
name: "iPhone 12",
price: 12000,
description: "Awesome phone",
category: "smartphone",
},
];
}
}
ts
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
@Module({
// 无需导入 phone 模块
imports: [],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
@Module({
// 无需导入 phone 模块
imports: [],
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
ts
import { Controller, Get } from "@nestjs/common";
import { PhoneService } from "../phone/phone.service";
@Controller("user")
export class UserController {
constructor(private readonly phoneService: PhoneService) {}
@Get("phone")
async getUserPhone() {
// 在 user 模块中,使用 phone 模块中的 PhoneService
const phone = await this.phoneService.getAllPhones();
return phone;
}
}
import { Controller, Get } from "@nestjs/common";
import { PhoneService } from "../phone/phone.service";
@Controller("user")
export class UserController {
constructor(private readonly phoneService: PhoneService) {}
@Get("phone")
async getUserPhone() {
// 在 user 模块中,使用 phone 模块中的 PhoneService
const phone = await this.phoneService.getAllPhones();
return phone;
}
}
总结
共享模块,需要 A 模块导出(exports)provider,并在 B 模块中导入(imports),B 模块才能使用 A 模块的 provider。
全局模块,需要@Global 声明,其exports 的 provider就是全局的。可以在任何模块中使用。