【问题标题】:@Inject services in other service - Nest can't resolve dependencies@Inject 其他服务中的服务 - Nest 无法解决依赖关系
【发布时间】:2019-10-09 05:37:10
【问题描述】:

我正在尝试将两个服务@Inject 到一个 NestJS 服务中并且得到了

Nest 无法解析 MainServiceImpl (?, 符号(MainDao))。请确保索引 [0] 处的参数是 在 MainModule 上下文中可用

这里是服务:

@Injectable()
export class MainServiceImpl implements MainService {

    constructor(
        @Inject(TYPES.PublishSubscriptionService) private publishSubscriptionService: PublishSubscriptionService,
        @Inject(TYPES.MainDao) private mainDao: MainDao
    ) {}

现在,如果我切换顺序,总是第二个注入的服务得到错误。

TYPES 是Symbols 的对象

const TYPES = {
    PublishSubscriptionService: Symbol('PublishSubscriptionService'),
    MainDao: Symbol('MainDao'),
};
export default TYPES;

这里是使用桶的 index.ts

// start:ng42.barrel
export * from './main.dao.mongo-impl';
export * from './main.dao';
export * from './main';
export * from './main.schema';
export * from './main.service.impl';
export * from './main.service';
// end:ng42.barrel

我错过了什么?

Closed NestJS issue with no resolution
NestJS doc on @Global modules

【问题讨论】:

  • 您是否创建了自定义提供程序以也使用符号?如果是这样,该自定义提供程序是否与您当前尝试使用的服务模块处于同一上下文中?
  • 这听起来可能是 index.ts 问题。你在用桶文件吗?如果是这样,您需要显示更多代码以帮助查明问题。
  • 这很有趣@raychz,我已经为这个模块添加了索引文件,但无法理解它是如何参与的。

标签: node.js dependency-injection dao nestjs


【解决方案1】:

如果没有看到您的 MainServieImplModule 或包含此服务的任何模块,我无法确定,但如果我不得不猜测,您并没有为这两个服务正确地声明您的 providers 到 Nest。您需要像这样创建一个自定义提供程序

@Module({
  provides: [
    {
      provide: TYPES.PublishSubscriptionService,
      useClass: PublishSubscriptionService,
    },
    {
      provide: TYPES.MainDao,
      useClass: MainDao
    },
    MainServiceImpl
  ]
})
export class MainServiceImplModule {}

但是,如果这些提供程序是不同模块的一部分,则您需要确保提供程序是自定义的(如上所述),但也已导出,以便可以在不同模块中导入和使用它们。在没有看到更多代码的情况下,无法回答这个问题,但我认为这应该为您提供所需的方向。如果没有,请编辑您的问题并添加更多信息。

【讨论】:

  • 我相信最后一个问题是原来的 Node 项目使用了深度抽象。转换为 Nest 打破了这一点,需要先重建。 MainDao 仅在重新指向实际构造之前引用接口。
【解决方案2】:

不知道TYPES是什么,可以使用@Inject(PublishSubscriptionService) 也可以直接使用:

constructor(
        private publishSubscriptionService: PublishSubscriptionService,
        private mainDao: MainDao
) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-20
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2019-09-14
    • 2021-07-17
    相关资源
    最近更新 更多