'How to init RouterModule with variable from ConfigService?
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;
}
}
Solution 1:[1]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Seraf |