首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >typedi构造函数注入返回未定义的

typedi构造函数注入返回未定义的
EN

Stack Overflow用户
提问于 2021-11-20 20:39:20
回答 2查看 922关注 0票数 0

我正在一个Node (快递)项目中使用typedi。我不明白为什么在我的服务类中,注入作为属性注入而不是构造函数注入工作得很好。

这样做是可行的:

代码语言:javascript
复制
@Service()
export default class AuthService {
  @Inject("logger") private logger
  @Inject("eventEmitter")
  private eventEmitter!: EventEmitter;
   
  constructor(

  ) {}
}

虽然这是行不通的:

代码语言:javascript
复制
@Service()
export default class AuthService {
  @Inject("logger") private logger
  @Inject("eventEmitter")
  private eventEmitter!: EventEmitter;
   
  constructor(
      @Inject("logger") private logger,
      @Inject("eventEmitter") private eventEmitter: EventEmitter
  ) {}
}

例如,我使用记录器和发射器如下:

代码语言:javascript
复制
  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是未定义的。

作为附带说明:

  • I导入的‘反射-元数据’中没有循环依赖项
  • ,实际上,如果将它们放在属性上而不是在构造函数的

中,那么装饰器可以正常工作,除非这个问题很好。我可以使用Container#get,Container#set,没有任何问题的

EN

回答 2

Stack Overflow用户

发布于 2021-11-20 22:57:10

在第二个代码片段中,您已经在用AuthService装饰@Service(),这应该足够了。

因此,将其改为这个,并尝试一下:

代码语言:javascript
复制
@Service()
export default class AuthService {

  constructor(
      private logger: YOU_NEED_A_TYPE_HERE,
      private eventEmitter: EventEmitter
  ) {}
}

只需确保使用记录器的实际类型更改YOU_NEED_A_TYPE_HERE,否则它将无法工作。

然后,您应该有您的loggereventEmitter引用:

代码语言:javascript
复制
public async SignUp(
    userInputDTO: IUserInputDTO
  ): Promise<{ user: IUser; token: string }> {
    try {
    
    // logger and eventEmitter should have the right values
票数 0
EN

Stack Overflow用户

发布于 2021-11-21 02:35:40

开始起作用了,但我不知道是什么原因造成的。

  • I在另一台具有较新节点版本的机器上工作(本问题中的示例在node12上运行,而它开始使用node16)。

  • 我在tsconfig.json中添加了一条缺少的行。

"emitDecoratorMetadata":真,

"experimentalDecorators": true已经在那里的时候。

也许是时候在不同的节点版本中设置一个小容器来测试它了。

顺便提一句,向构造函数参数注入添加显式类型似乎并不是严格要求的(但无论如何都是建议的)。而且,只要类已经使用了@Inject装饰,那么这个@Service装饰器似乎也是不必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70049694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档