繁体   English   中英

尝试在 NestJS 中注入 Bull Queue 时无法解决依赖关系

[英]Can't resolve dependency when try to inject a Bull Queue in NestJS

我正在尝试使用 Bull/Redis 实现 Nodemailer 来处理 NestJS 中的电子邮件类型的任务。

我有一个名为EmailService的共享模块,它向我的队列添加一个作业,为此,它需要从'bull'注入Queue

Nest 无法解析 EmailService (?) 的依赖关系。 请确保索引 [0] 处的参数 BullQueue_mailqueue 在 SharedModule 上下文中可用。

我的结构

├── src
|  ├── app.module.ts
|  ├── config
|  |  └── nodemailer
|  |     ├── nodemailer.module.ts
|  |     ├── nodemailer.service.ts
|  └── modules
|     ├── modules that imports the SharedModule to send emails.
|  └── shared
|     ├── processors
|     |  └── email.processor.ts
|     ├── services
|     |  └── email
|     ├── shared.module.ts

应用程序模块

@Module({
  imports: [
    NodemailerModule,
    // Al other modules (functionalities of my application that imports the SharedModule)
  ],
})
export class AppModule {}

nodemailer.module

@Module({
  imports: [
    MailerModule.forRootAsync({
      useClass: NodemailerService,
    }),
    BullModule.registerQueueAsync({
      useClass: NodemailerService,
    }),
  ],
  exports: [NodemailerService, BullModule], // <- Exports BullModule
  providers: [NodemailerService],
})
export class NodemailerModule {}

节点邮件服务

@Injectable()
export class NodemailerService implements BullOptionsFactory {
  constructor() {}

  createBullOptions(): Promise<BullModuleOptions> | BullModuleOptions {
    return {
      name: 'myqueue',
      redis: {
        host: 'localhost',
        port: 6379,
      },
    };
  }

}

现在这是我的 EmailService,它是 SharedModule 的一部分。

import { Injectable } from '@nestjs/common';
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';

@Injectable()
export class EmailService {

  constructor(
    @InjectQueue('myqueue')
    private readonly mailQueue: Queue,
  ) {}

}

共享模块

@Module({
  imports: [NodemailerModule], // < imports this because it has the Bull configuration as we saw above
  exports: [EmailService],
  providers: [EmailService, EmailProcessor],
})
export class SharedModule {}

我试图按照以下步骤操作:

  1. https://firxworx.com/blog/coding/nodejs/email-module-for-nestjs-with-bull-queue-and-the-nest-mailer/
  2. 在 Typescript 中实现公牛队列

我不明白为什么我的EmailService不能注入 BullQueue 依赖项。

我在这里缺少什么?

您需要在应用模块中导入 BullModule。 作为文档:为了防止在BullModule BullConfigService使用从不同模块导入的提供程序,您可以使用useExisting语法。

BullModule.forRootAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
});

所以为 root 导入 BullModule 是必要的

查看文档:这里

注入队列的模块需要导入队列注册。 IE

folder/some.module.ts

@Module({
  imports: [
    BullModule.registerQueue({
      name: 'some-queue',
    }),
  ],
  providers: [SomeService],
})
export class SomeModule {}

然后在SomeService

folder/some.service.ts

constructor(
  @InjectQueue('some-queue') private someQueue: Queue,
) {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM