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:
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 valuesComenzó 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