【发布时间】:2021-12-31 02:30:47
【问题描述】:
我在 Node (express) 项目中使用 typedi。 我不明白为什么在我的服务类中,注入可以作为属性注入但不能作为构造函数注入。
这行得通:
@Service()
export default class AuthService {
@Inject("logger") private logger
@Inject("eventEmitter")
private eventEmitter!: EventEmitter;
constructor(
) {}
}
虽然这不起作用:
@Service()
export default class AuthService {
@Inject("logger") private logger
@Inject("eventEmitter")
private eventEmitter!: EventEmitter;
constructor(
@Inject("logger") private logger,
@Inject("eventEmitter") private eventEmitter: EventEmitter
) {}
}
作为一个例子,我使用记录器和发射器如下:
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;
}
}
在第一种情况下,它按预期工作,但在第二种情况下,this.eventEmitter 和 this.logger 未定义。
附注:
- 不存在循环依赖
- 我导入了“reflect-metadata”,实际上,如果将装饰器放在属性上而不是在构造函数的参数中,则装饰器可以正常工作
- typedi,除非这个问题可以正常工作。我可以毫无问题地使用 Container#get 、 Container#set
【问题讨论】:
标签: javascript node.js typescript express dependency-injection