gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:37:15 25 4
gpt4 key购买 nike

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

-src
-config
-configuration.ts
-modules
-auth
-user
-utils
-util.ts
在我的身份验证和用户模块中,我导入 ConfigModule然后我可以使用 ConfigService从 configuration.ts 文件中获取配置值。
但是如何在 utils/util.ts 中获取配置值文件?
它只是一个包含一些帮助文件而不是模块目录的目录。

最佳答案

假设您想要 ConfigService 的相同实例用于... 从 NestJS 的角度 ,我看到两个选项:

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

  • 关于第二个选项:

    // regular typescript class
    // exported so you can type your injected "configService" in other classes
    export class ConfigService {
    // your code
    }

    export default new ConfigService();

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

    import configService, { ConfigService } from './somewhere/config-service.ts';

    const configServiceProvider = {
    provide: ConfigService,
    useValue: configService,
    };

    // and use it in your ConfigModule
    @Module({
    providers: [configServiceProvider],
    exports: [configServiceProvider],
    })
    export class ConfigModule {}

    注入(inject)时 ConfigService在您的 NestJS 应用程序中,该值将解析为 configService (只要 ConfigModule 在范围内,显然)。

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

    const configServiceProvider = {
    provide: ConfigService,
    useFactory: (somethingService: SomethingService) => new ConfigService(somethingService),
    inject: [SomethingService],
    };

    // and in the ConfigModule
    @Module({
    imports: [SomethingModule], // so you can inject SomethingService
    providers: [configServiceProvider],
    exports: [configServiceProvider],
    })
    export class ConfigModule {}

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

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

    // old version
    export const readDeploymentConfigFile = (filePath: string) => {
    // ...
    };

    // new version
    export const readDeploymentConfigFile = (configService: ConfigService) => (filePath: string) => {
    // ...
    };

    This video可能是鼓舞人心的(“Dead-Simple Dependency Injection” by Rúnar Óli Bjarnason,2012 年),即使这与 TypeScript 或 Nest 无关。

    但这作为 API 使用并不理想,它也可能揭示一些设计缺陷...如果您的 util函数需要一些动态/外部配置值,我们是否仍然可以将它们视为 util职能?

    关于NestJS - 如何在 NestJS 托管类之外使用 ConfigService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61153111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com