簡體   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