我正在一个Node (快递)项目中使用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是未定义的。
作为附带说明:
中,那么装饰器可以正常工作,除非这个问题很好。我可以使用Container#get,Container#set,没有任何问题的
发布于 2021-11-20 22:57:10
在第二个代码片段中,您已经在用AuthService装饰@Service(),这应该足够了。
因此,将其改为这个,并尝试一下:
@Service()
export default class AuthService {
constructor(
private logger: YOU_NEED_A_TYPE_HERE,
private eventEmitter: EventEmitter
) {}
}只需确保使用记录器的实际类型更改YOU_NEED_A_TYPE_HERE,否则它将无法工作。
然后,您应该有您的logger和eventEmitter引用:
public async SignUp(
userInputDTO: IUserInputDTO
): Promise<{ user: IUser; token: string }> {
try {
// logger and eventEmitter should have the right values发布于 2021-11-21 02:35:40
开始起作用了,但我不知道是什么原因造成的。
tsconfig.json中添加了一条缺少的行。"emitDecoratorMetadata":真,
当"experimentalDecorators": true已经在那里的时候。
也许是时候在不同的节点版本中设置一个小容器来测试它了。
顺便提一句,向构造函数参数注入添加显式类型似乎并不是严格要求的(但无论如何都是建议的)。而且,只要类已经使用了@Inject装饰,那么这个@Service装饰器似乎也是不必要的。
https://stackoverflow.com/questions/70049694
复制相似问题