Tengo un servicio, que requiere un objeto de configuración literal en su constructor, algo como esto:
@Injectable() export class BatteriesService { constructor(private config: Config) { }//The provider needs a config object }
Si simplemente agrego esta clase en la matriz de proveedores del módulo, obviamente obtengo un error, ya que falta un argumento de constructor.
Entonces, en lugar de solo hacer referencia a la clase BatteriesService, de alguna manera necesito crear una instancia. Intenté esto:
@Module({ controllers: [BatteriesController], providers: [{ useFactory: ()=>{ return new BatteriesService({'someProp': 'someValue'}) }, provide:'BatteriesService' }] })
Y esto:
@Module({ controllers: [BatteriesController], providers: [{ useValue:new BatteriesService({'someProp': 'someValue'}), provide:'BatteriesService' }] })
En ambos casos me sale el siguiente error:
Error: Nest no puede resolver las dependencias de BatteriesController (?). Asegúrese de que el argumento BatteriesService en el índice [0] esté disponible en el contexto BatteriesModule.
¿Cómo se puede hacer esto, sin "recurrir" a eludir el sistema DI o crear otro proveedor "interno" (config)?
Cuando necesite tener DI en servicio, eso debe definirse en el módulo.
En tu caso
@Injectable() export class BatteriesService { constructor(private config: ConfigService) { } } @Module({ imports: [ConfigModule.forRoot({})], // Configure it as needed providers: [BatteriesService] })
Su error es que en realidad no importa ConfigModule
mientras su servicio depende de él.
Si desea utilizar el método useFactory
, se vería así
@Module({ providers: [{ useFactory: (config: ConfigService) => { return new BatteriesService(config); }, provide: BatteriesService, inject: [ConfigService] }] })
Supuse que su Config
es en realidad Nest ConfigModule .
Pero si se trata de un módulo personalizado, aún debe importarlo como en los ejemplos anteriores.
Si desea pasar un objeto literal como configuración, intente esto
interface MyConfigType = { something: string; } @Injectable() export class BatteriesService { constructor(@Inject('CONFIG') private config: MyConfigType) { } } @Module({ providers: [{ provide: 'CONFIG', useValue: { something: 'my-value' } }] })