繁体   English   中英

nestjs 模块 - beetwean 提供程序和导入的区别是什么

[英]nestjs modules - whats the diffrence beetwean providers and imports

我正在关注nestJs身份验证教程

在 auth/auth.module.ts 中:

import { JwtModule } from '@nestjs/jwt'


...

@Module({
  imports: [

    UsersModule,
    PassportModule,
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService, LocalStrategy, JwtStrategy],
  exports: [AuthService],
})

所以 JwtModule 是在“imports”下导入的。

在 auth/auth.service.ts 中,JwtService 被注入

...
import { JwtService } from '@nestjs/jwt';

@Injectable()
export class AuthService {
  constructor(
    private usersService: UsersService,
    private jwtService: JwtService
  ) {}

...

来自nestJs 文档:

在模块下:提供程序 - 将由 Nest 注入器实例化并且至少可以在此模块之间共享的提供程序

imports -   the list of imported modules that export the providers which are required in this module

在提供者下:

Providers are a fundamental concept in Nest.
Many of the basic Nest classes may be treated as a provider – services, repositories, 
factories, helpers, and so on. 
The main idea of a provider is that it can be injected as a dependency; 
this means objects can create various relationships with each other, and the function 
of "wiring up" instances of objects can largely be delegated to the Nest runtime system

我真的不明白。 如果两者都用于依赖注入,提供者和导入之间有什么区别?

将提供者视为可以注入和使用的单一事物。 它可以是一个完整的 class,如AuthService ,或一个 object,如{ secretOrKey: 'sup3rs3cr3t' } ,甚至只是一个像42这样的数字。 这些对象中的每一个都将由提供者令牌表示:对于类,这只是 class 引用本身,稍后将通过发出的元数据读取 object 和数字将由自定义提供者指定的注入令牌表示,例如

{
  provide: 'JWT_OPTIONS',
  useValue: {
    secretOrKey: 'sup3rs3cr3t',
  }
}

或者

{
  provide: 'THE_ANSWER',
  useValue: 42,
}

顺便说一句,要注入这些自定义提供程序,您最终会在另一个服务的构造函数中使用@Inject('JWT_OPTIONS')@Inject('THE_ANSWER') ,或者只是在工厂自定义inject数组中使用注入令牌提供者


另一方面,模块是模块、提供程序、控制器和导出的集合,它们将功能联系在一起。 几乎可以把它想象成一个容器,它有自己的私有 API(不导出的提供程序)(这些是在模块内部但不在模块外部使用的提供程序和方法),公共 API(导出的提供程序)(这些是在模块内部和外部使用的提供程序和导入模块)和外部入口点(控制器、解析器、网关)(这些是传输可以与您的应用程序,特别是您的模块通信的方式)。

模块在其providers数组下声明的内容,Nest 将在模块的上下文中创建该提供者:这适用于在其他模块中实例化的提供者、只是对象的提供者等,它们将使用模块的任何资源创建有。

大多数情况下,如果您在两个提供者 arrays 中声明一个提供者,您将产生意想不到的副作用。 您通常想要做的是让单个模块声明提供程序并将其添加到其exports数组中,然后在另一个模块中首先导入以访问这些exports 这将使 Nest 在新模块中重新使用现有提供程序,以允许使用提供程序而无需重新创建它。


在您的JwtModule示例中,如果我们查看源模块,我们会看到始终存在一个提供程序,即JwtService ,并且它也始终被导出,并且有一个提供程序出现在您使用JWT_MODULE_OPTIONS提供程序register/registerAsync 这个提供者永远不会被导出,所以它只存在于模块内部。 但是,当我们导入JwtModule时,我们现在将JwtModule导入到的任何模块都可以将JwtService注入其providers ,因为JwtModuleexports中具有JwtService 如果提供者尝试注入JWT_MODULE_OPTIONS ,则会出现错误,因为新模块不知道该提供者(当然,除非您使用相同的名称为它创建自己的提供者)

希望这一切都有助于解决问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM