• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

594
Views
¿Cómo pasar argumentos de constructor a un proveedor de NestJS?

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)?

about 3 years ago · Juan Pablo Isaza
1 answers
Answer question

0

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' } }] })
about 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error