yot*_*y66 11 javascript node.js nestjs
我正在关注 NestJs身份验证教程
\n在 auth/auth.module.ts 中:
\nimport { JwtModule } from \'@nestjs/jwt\'\n\n\n...\n\n@Module({\n imports: [\n\n UsersModule,\n PassportModule,\n JwtModule.register({\n secret: jwtConstants.secret,\n signOptions: { expiresIn: \'60s\' },\n }),\n ],\n providers: [AuthService, LocalStrategy, JwtStrategy],\n exports: [AuthService],\n})\nRun Code Online (Sandbox Code Playgroud)\n因此 JwtModule 是在 \'imports\' 下导入的。
\n在 auth/auth.service.ts 中注入 JwtService
\n...\nimport { JwtService } from \'@nestjs/jwt\';\n\n@Injectable()\nexport class AuthService {\n constructor(\n private usersService: UsersService,\n private jwtService: JwtService\n ) {}\n\n...\nRun Code Online (Sandbox Code Playgroud)\n来自 NestJs 文档:
\n在模块下:\nproviders - 将由 Nest 注入器实例化并且至少可以在该模块中共享的提供程序
\nimports - the list of imported modules that export the providers which are required in this module\nRun Code Online (Sandbox Code Playgroud)\n在提供商下:
\nProviders are a fundamental concept in Nest.\nMany of the basic Nest classes may be treated as a provider \xe2\x80\x93 services, repositories, \nfactories, helpers, and so on. \nThe main idea of a provider is that it can be injected as a dependency; \nthis means objects can create various relationships with each other, and the function \nof "wiring up" instances of objects can largely be delegated to the Nest runtime system\nRun Code Online (Sandbox Code Playgroud)\n我不太明白。如果提供者和导入都用于依赖注入,那么两者有什么区别?
\nJay*_*iel 16
将提供程序视为可以注入和使用的单个事物。它可以是一个完整的类,如AuthService,也可以是一个对象,如{ secretOrKey: 'sup3rs3cr3t' },甚至只是一个数字,如42。这些对象中的每一个都将由提供者令牌表示:对于类,这只是类引用本身,稍后将通过发出的元数据读取,对象和数字将由自定义提供者指定的注入令牌表示,例如
{
provide: 'JWT_OPTIONS',
useValue: {
secretOrKey: 'sup3rs3cr3t',
}
}
Run Code Online (Sandbox Code Playgroud)
或者
{
provide: 'THE_ANSWER',
useValue: 42,
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,要注入这些自定义提供程序,您最终会在另一个服务的构造函数中使用@Inject('JWT_OPTIONS')或,或者仅在工厂自定义提供程序的数组@Inject('THE_ANSWER')中使用注入令牌inject
另一方面,模块是模块、提供者、控制器和导出的集合,它们将功能绑定在一起。几乎可以将其视为一个容器,它有自己的私有 API(不是导出的提供程序)(这些是在模块内部使用但不在模块外部使用的提供程序和方法)、一个公共 API(导出的提供程序)(这些是在模块内部和外部使用的提供程序和导入模块)以及外部入口点(控制器、解析器、网关)(这些是传输可以与您的应用程序(特别是您的模块)进行通信的方式)。
模块在其providers数组下声明的内容,Nest 将在模块的上下文中创建该提供程序:这适用于在其他模块中实例化的提供程序、只是对象的提供程序等,它们将使用模块拥有的任何资源创建。
大多数时候,如果您在两个提供程序数组中声明一个提供程序,您将会产生意想不到的副作用。您通常想要做的是让单个模块声明提供程序并将其添加到其exports数组中,然后在另一个模块中导入第一个以访问这些提供程序exports;这将使 Nest 在新模块中重新使用现有提供程序,以允许使用提供程序而无需重新创建它。
对于您的示例JwtModule,如果我们查看源模块,我们将看到始终存在一个提供程序,即JwtService,并且它也始终被导出,并且当您使用时会显示一个提供程序register/registerAsync,JWT_MODULE_OPTIONS提供者。该提供程序永远不会导出,因此它仅存在于模块内部。然而,当我们导入 时JwtModule,我们现在导入的任何模块都JwtModule可以将 注入到JwtService其中,providers因为. 如果提供者尝试注入,那么将会出现错误,因为新模块不知道该提供者(当然,除非您使用相同的名称为其创建自己的提供者)JwtModuleJwtServiceexportsJWT_MODULE_OPTIONS
希望这一切有助于解决问题
| 归档时间: |
|
| 查看次数: |
7851 次 |
| 最近记录: |