NodeJS 为什么在Nestjs中导入类的不同方式会影响依赖注入?

k0pti3hp  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(97)

我正在开发NestJS项目与typescript。我尝试将一个类注入到构造函数中,如下所示:

@Injectable()
export class AuthService {
  constructor(
    ...Some omitted content,
    private loginFactory: LoginFactory,
  ) {}
}

LoginFactory是一个工厂类,如下所示:

@Injectable()
export class LoginFactory {
  constructor(
    private readonly phoneLoginService: PhoneLoginService,
    private readonly verificationCodeLoginService: VerificationCodeLoginService,
  ) {}
}

PhoneLoginService类和VerificationCodeLoginService类都继承一个名为AbstractLoginService的抽象类,如下所示:

@Injectable()
export class PhoneLoginService extends AbstractLoginService {
  constructor(protected readonly userService: UserService) {
    super(userService);
  }
}
@Injectable()
export class VerificationCodeLoginService extends AbstractLoginService {
  constructor(protected readonly userService: UserService) {
    super(userService);
  }
}

AbstractLoginService抽象类如下:

export abstract class AbstractLoginService<T extends LoginDto = LoginDto> {
  constructor(protected readonly userService: UserService) {}
  ...Some omitted content
}

我的AuthModule内容如下:

@Module({
  ...Some omitted content
  providers: [
    AuthService,
    PhoneLoginService,
    VerificationCodeLoginService,
    LoginFactory,
  ],
})
export class AuthModule {}

我的代码工作正常,直到我最近清理了文件结构。具体来说,我是这样在AuthService中导入LoginFactory的:import { LoginFactory } from './login-factory.service';由于以上服务类都在services目录下,我新增了一个名为index.ts的文件,作为统一的出口,其内容如下:

export * from './abstract-login.service';
export * from './auth.service';
export * from './login-factory.service';
export * from './phone-login.service';
export * from './verificationCode-login.service';

与此同时,我将AuthService类中LoginFactory类的导入方法更改为:

import { LoginFactory } from './';

然而,当我再次启动该项目时,我报告了以下错误:

Error: Nest can't resolve dependencies of the LoginFactory (?, +). Please make sure that the argument dependency at index [0] is available in the AuthModule context.

Potential solutions:
- Is AuthModule a valid NestJS module?
- If dependency is a provider, is it part of the current AuthModule?
- If dependency is exported from a separate @Module, is that module imported within AuthModule?
  @Module({
    imports: [ /* the Module containing dependency */ ]
  })

看起来LoginFactory类的注入出现了问题。但是当我在AuthService类中更改了LoginFactory的导入方式时,一切都恢复正常。具体来说,我将导入方法更改回如下所示:import { LoginFactory } from './login-factory.service';我猜这可能是进口订单的问题。但这只是推测。我会很感激你的帮助。
我尝试着一点一点地改变文件的导入方式,最终确定LoginFactory的导入方式影响了项目的正常运行

ki0zmccv

ki0zmccv1#

当您使用桶式导入(./或类似./auth的东西)时,您并不是从相关的index.ts文件中导入 * 仅 * 必要的文件,而是从该文件导入所有导出,并且每个文件也导入它需要的所有内容。在本例中,您正在对文件本身创建循环导入语句。auth.service./导入,这意味着它导入auth.serviceabstract-ogin.servicelogin-factory.service和其他。auth.service导入auth.service的事实已经是一个危险信号,但是如果你看一下login-factory.service,它 * 也 * 从./导入,那么它 * 也 * 导入auth.service,现在你有一个两部分的循环链,这可以继续为尽可能多的文件。

  • 我的 * 桶文件的一般规则是,从 * 外部 * 的功能,它的罚款进口从他们,但从 * 内部 * 的功能,直接进口从文件。这也有助于区分特性的公共和私有API。

相关问题