如何使用 ConfigService 中的变量初始化 RouterModule?

发布于 2025-01-15 01:37:46 字数 1183 浏览 4 评论 0原文

我想使用 RouterModule.register(arrayOfRoutes),但我需要使用 ConfigService 中的变量构建 arrayOfRoutes。

这样做的正确方法是什么?

感谢您的帮助! ;)

// current state, appRoutes is not customizable.

// app.routes.ts
export const appRoutes: Routes = [
  { path: RouteEnum.EndpointA, module: EndpointAModule },
  { path: RouteEnum.EndpointB, module: EndpointBModule },
];

// app.module.ts
@Module({
  imports: [
    ConfigModule.forRoot({ load: loadConfiguration(), cache: true, isGlobal: true }),
    RouterModule.register(appRoutes)
  ],
})
export class AppModule {}

我想使用这样的服务:

// routes.service.ts
@Injectable()
export class RoutesService {
  #routes: Routes = [
    { path: RouteEnum.EndpointA, module: EndpointAModule },
    { path: RouteEnum.EndpointB, module: EndpointBModule },
  ];

  constructor(private readonly configService: ConfigService) {
    if (this.configService.get('endpoint-c')?.enabled === true) {
      this.#routes.push({ path: RouteEnum.EndpointC, module: EndpointCModule });
    }
  }

  getRoutes(): RouteTree[] {
    return this.#routes;
  }
}

I want to use the RouterModule.register(arrayOfRoutes), but I need to build the arrayOfRoutes with a variable from the ConfigService.

What is the proper way to do that ?

Thanks for the help ! ;)

// current state, appRoutes is not customizable.

// app.routes.ts
export const appRoutes: Routes = [
  { path: RouteEnum.EndpointA, module: EndpointAModule },
  { path: RouteEnum.EndpointB, module: EndpointBModule },
];

// app.module.ts
@Module({
  imports: [
    ConfigModule.forRoot({ load: loadConfiguration(), cache: true, isGlobal: true }),
    RouterModule.register(appRoutes)
  ],
})
export class AppModule {}

I’d like to use some kind of service like this :

// routes.service.ts
@Injectable()
export class RoutesService {
  #routes: Routes = [
    { path: RouteEnum.EndpointA, module: EndpointAModule },
    { path: RouteEnum.EndpointB, module: EndpointBModule },
  ];

  constructor(private readonly configService: ConfigService) {
    if (this.configService.get('endpoint-c')?.enabled === true) {
      this.#routes.push({ path: RouteEnum.EndpointC, module: EndpointCModule });
    }
  }

  getRoutes(): RouteTree[] {
    return this.#routes;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛夏尉蓝 2025-01-22 01:37:46

它是这样结束的:

  • 停止使用 RouterModule
  • 而不是 RouterModule,直接在控制器中使用 @Controller('some_route') 装饰器
  • 修改 AppModule 的默认注册方法:
// app.module.ts
@Module({ imports: [...manyModules] })
export class AppModule {
  static register(configuration: Configuration): DynamicModule {
    const dynamicModule: DynamicModule = {
      module: AppModule,
      imports: [
        ConfigModule.forRoot({ load: [() => ({ configuration })], cache: true, isGlobal: true }),
      ],
    };
    if (configuration.myEndpointB.enabled) {
      // EndpointBModule contains a endpoint-b.controller, with the @Controller
      dynamicModule.imports?.push(EndpointBModule);
    }
    return dynamicModule;
  }
}
// main.ts
const app = await NestFactory.create<NestFastifyApplication>(
    AppModule.register(configuration),
    new FastifyAdapter()
  );

在调用 AppModule 之前处理配置。注册是我们想做的。

It ended like this :

  • stoping using the RouterModule
  • instead of RouterModule, using the @Controller('some_route') decorator directly in the controllers
  • modifying the default register method of the AppModule :
// app.module.ts
@Module({ imports: [...manyModules] })
export class AppModule {
  static register(configuration: Configuration): DynamicModule {
    const dynamicModule: DynamicModule = {
      module: AppModule,
      imports: [
        ConfigModule.forRoot({ load: [() => ({ configuration })], cache: true, isGlobal: true }),
      ],
    };
    if (configuration.myEndpointB.enabled) {
      // EndpointBModule contains a endpoint-b.controller, with the @Controller
      dynamicModule.imports?.push(EndpointBModule);
    }
    return dynamicModule;
  }
}
// main.ts
const app = await NestFactory.create<NestFastifyApplication>(
    AppModule.register(configuration),
    new FastifyAdapter()
  );

Handling the configuration before calling AppModule.register is what we wanted to do.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文