我在 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
uj5u.com熱心網友回復:
在第二個代碼片段,你已經裝飾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
uj5u.com熱心網友回復:
它開始作業,但我不確定是什么原因造成的。
我在另一臺具有較新節點版本的機器上作業(這個問題中的示例是在 node12 上運行的,同時它開始使用 node16)。
我在
tsconfig.json缺少的行中添加了一行。“emitDecoratorMetadata”:真,
雖然"experimentalDecorators": true已經在那里了。
也許是時候設定一個小容器在不同的節點版本中進行測驗了。
作為旁注,似乎并不嚴格要求向建構式引數添加顯式型別以注入(但無論如何建議)。此外@Inject,只要類已經被裝飾,裝飾器似乎也沒有必要@Service
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/361720.html
標籤:javascript 节点.js 打字稿 表达 依赖注入
