NestJS - 如何在 NestJS 托管类之外使用 ConfigService?

use*_*401 6 nestjs

我正在开发一个 NestJS 项目。这是我的项目结构:

-src
 -config
  -configuration.ts
 -modules
  -auth
  -user
 -utils
  -util.ts
Run Code Online (Sandbox Code Playgroud)

在我的身份验证和用户模块中,我导入ConfigModule,然后可以使用它ConfigService从 configuration.ts 文件中获取配置值。

但是如何获取utils/util.ts文件中的配置值?
它只是一个保存一些帮助文件的目录,而不是模块目录。

Vin*_*OPS 3

假设您希望ConfigService使用相同的实例...从 NestJS 的角度来看,我看到两个选项:

\n\n
    \n
  • 将您的函数分组util到单个 Provider 中,并将其视为 NestJS 应用程序的合法组件(或者按职责将它们分组到多个 Provider 中,这也更有意义)
  • \n
  • 让您的配置服务作为 node.js 模块使用,您可以从 导入“按原样” ,并从 NestJS 应用程序util声明为自定义。Provider
  • \n
\n\n

关于第二个选项:

\n\n
// regular typescript class\n// exported so you can type your injected "configService" in other classes\nexport class ConfigService {\n // your code\n}\n\nexport default new ConfigService();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可以按原样导入util
\n并通过创建自定义提供程序注入到您的 NestJS 应用程序中:

\n\n
import configService, { ConfigService } from \'./somewhere/config-service.ts\';\n\nconst configServiceProvider = {\n  provide: ConfigService,\n  useValue: configService,\n};\n\n// and use it in your ConfigModule\n@Module({ \n  providers: [configServiceProvider],\n  exports: [configServiceProvider],\n})\nexport class ConfigModule {}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当注入ConfigServiceNestJS 应用程序时,该值将被解析为configService(显然,只要ConfigModule在范围内)。

\n\n

但是,这不允许您ConfigService在其构造函数参数中注入任何内容...除非您准备好使用两个不同的实例ConfigService(一个用于util,一个用于您的 NestJS 应用程序)。在这种情况下,您可以使用 Factory 提供程序,如下所示:

\n\n
const configServiceProvider = {\n  provide: ConfigService,\n  useFactory: (somethingService: SomethingService) => new ConfigService(somethingService),\n  inject: [SomethingService],\n};\n\n// and in the ConfigModule\n@Module({\n  imports: [SomethingModule], // so you can inject SomethingService\n  providers: [configServiceProvider],\n  exports: [configServiceProvider],\n})\nexport class ConfigModule {}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这没有多大意义,因为您还需要 NestJS 范围之外的 available 依赖项ConfigService以便在函数中使用它。util

\n\n
\n\n

另一种选择(不考虑任何框架)是允许您自己传递(通过参数)... 例如ConfigServiceutil

\n\n
// old version\nexport const readDeploymentConfigFile = (filePath: string) => {\n  // ...\n};\n\n// new version\nexport const readDeploymentConfigFile = (configService: ConfigService) => (filePath: string) => {\n  // ...\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

该视频可能会鼓舞人心(“Dead-Simple Dependency Injection”,作者:R\xc3\xbanar\xc3\x93li Bjarnason,2012),即使它与 TypeScript 或 Nest 无关。

\n\n

但这对于用作 API 来说并不理想,而且还可能会暴露一些设计缺陷...如果您的util函数需要一些动态/外部配置值,我们仍然可以将它们视为util函数吗?

\n