blog icon indicating copy to clipboard operation
blog copied to clipboard

nestjs模块

Open chenlong-io opened this issue 4 years ago • 0 comments

要想使用 nest 开发,你必须了解 module ,否则无法下手,也搞不懂模块间的引用逻辑。

如果你不懂 nest 里的模块,可以这样理解:它类似组件化概念里的组件,比如在写 React 时,我们有一个根组件,一个 React 应用由多个组件构成的; 在 nest 应用中,也有一个根模块( app.module, 即上图中的 Application Module ),整个 nest 应用由多个模块和一个根模块构成;

来看一个模块:

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  imports: [],
  controllers: [CatsController],
  providers: [CatsService],
  exports: []
})
export class CatsModule {}

仔细看,当一个类被 @Module 装饰时,那么这个类就是一个模块类。@Module 参数中有 imports、controllers、providers、exports 四个参数,这几个参数的内容,就是该模块的所有。比如 CatsController 和 CatsService 属于同一个应用程序域,那么就应该把它们都归属到一个模块下。

  • imports: 引入的模块,当前模块需要使用其他模块的功能,就需要在这里将其他模块引进来
  • constrollers: 当前模块中的控制器
  • providers: 提供者就是为当前模块提供的功能,一般是 Service 或被 @Injectable() 装饰的类,这些类可以通过 constructor 注入依赖关系,只有 provider 可以在模块中被共享
  • exports: 向外部导出 providers 里的提供者(子集),否则即使外部模块引入了当前模块也无法使用providers里的功能

总结一下,一个完整的 Module 由 imports, controllers, providers, exports 构成,模块可以引入其他模块,从而使用跟多功能,也可以导出当前模块的提供者,为其他模块提供服务

chenlong-io avatar May 06 '21 09:05 chenlong-io