Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

118
Vistas
retorno de inyección de constructor typedi indefinido

Estoy usando typedi en un proyecto Node (express). No puedo entender por qué, en mi clase de servicio, la inyección funciona bien como inyección de propiedad pero no como inyección de constructor.

Esto funciona:

 @Service() export default class AuthService { @Inject("logger") private logger @Inject("eventEmitter") private eventEmitter!: EventEmitter; constructor( ) {} }

Si bien esto no funciona:

 @Service() export default class AuthService { @Inject("logger") private logger @Inject("eventEmitter") private eventEmitter!: EventEmitter; constructor( @Inject("logger") private logger, @Inject("eventEmitter") private eventEmitter: EventEmitter ) {} }

Como ejemplo, uso el registrador y el emisor de la siguiente manera:

 public async SignUp( userInputDTO: IUserInputDTO ): Promise<{ user: IUser; token: string }> { try { //some code this.logger.silly("Hashing password"); const hashedPassword = await argon2.hash(userInputDTO.password, { salt }); this.logger.silly("Creating user db record"); this.eventEmitter.emit(userEvent.signUp); //some code return { user: { }, token: "myToken", }; } catch (e) { this.logger.error(e); throw e; } }

En el primer caso funciona como se esperaba, pero en el segundo caso, this.eventEmitter y this.logger no están definidos.

Como nota al margen:

  • no hay dependencias circulares
  • Importé 'reflejar-metadatos', de hecho, los decoradores funcionan bien si se colocan en propiedades y no en los parámetros del constructor.
  • typedi, a menos que este problema funcione bien. Puedo usar Container#get , Container#set sin ningún problema
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

En el segundo fragmento de código, ya está decorando AuthService con @Service() , lo que debería ser suficiente.

Así que cámbialo a esto y pruébalo:

 @Service() export default class AuthService { constructor( private logger: YOU_NEED_A_TYPE_HERE, private eventEmitter: EventEmitter ) {} }

Solo asegúrese de cambiar YOU_NEED_A_TYPE_HERE con el tipo real del registrador, de lo contrario no funcionará.

Y luego debería tener disponibles las referencias de su logger y eventEmitter :

 public async SignUp( userInputDTO: IUserInputDTO ): Promise<{ user: IUser; token: string }> { try { // logger and eventEmitter should have the right values
about 4 years ago · Juan Pablo Isaza Denunciar

0

Comenzó a funcionar, pero no estoy seguro de qué lo causó.

  • Trabajé en otra máquina con una versión de nodo más nueva (el ejemplo en esta pregunta se ejecutó en el nodo 12 mientras comenzaba a funcionar con el nodo 16).

  • Agregué una línea en tsconfig.json que faltaba.

    "emitDecoratorMetadata": verdadero,

mientras que "experimentalDecorators": true ya estaba allí.

Tal vez sea hora de configurar un pequeño contenedor para probarlo en diferentes versiones de nodos.

Como nota al margen, parece que agregar un tipo explícito al parámetro del constructor para inyectar no es estrictamente necesario (pero de todos modos se sugiere). Además, el decorador @Inject también parece ser innecesario siempre que la clase ya esté decorada con @Service

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda