GithubHelp home page GithubHelp logo

registerAsync Error version 0.8.4 about bull HOT 14 CLOSED

nestjs avatar nestjs commented on April 20, 2024
registerAsync Error version 0.8.4

from bull.

Comments (14)

captainjapeng avatar captainjapeng commented on April 20, 2024 6

Yes, you'll need to create a module to reexport the BullModule

Here's an example:

import { BullModule, BullModuleOptions } from 'nest-bull'
import { Module } from '@nestjs/common'

import { ConfigModule } from 'src/config/config.module'
import { ConfigService } from 'src/config/config.service'

function redisOptions(configService: ConfigService) {
  return {
    host: configService.getString('REDIS_HOST'),
    port: configService.getInt('REDIS_PORT'),
  }
}

const BullQueueModule = BullModule.registerAsync([
  {
    name: 'email',
    imports: [ConfigModule],
    useFactory: (configService: ConfigService): BullModuleOptions => {
      return {
        name: 'email',
        options: {
          redis: redisOptions(configService),
        },
      }
    },
    inject: [ConfigService],
  },
  {
    name: 'cron',
    imports: [ConfigModule],
    useFactory: (configService: ConfigService): BullModuleOptions => {
      return {
        name: 'cron',
        options: {
          redis: redisOptions(configService),
        },
      }
    },
    inject: [ConfigService],
  },
])

@Module({
  imports: [BullQueueModule],
  exports: [BullQueueModule],
})
export class QueueModule { }

from bull.

captainjapeng avatar captainjapeng commented on April 20, 2024 2

@maxymshg you'll need to import the QueueModule to the module you want to use it and then also setup your Processor on the Providers

email.module.ts

@Module({
  imports: [
    forwardRef(() => QueueModule),
  ],
  providers: [EmailService, CronProcessor],
  exports: [EmailService],
})
export class EmailModule {}

cron.processor.ts

@Injectable()
@Processor({ name: 'cron' })
export class CronProcessor {
    private readonly logger = new Logger('EmailCron')

    constructor(
        @InjectQueue('email')
        private queueService: Queue<EmailJob>,
        @InjectQueue('cron')
        private cron: Queue,
    ) {
        this.logger.log('Intializing Cron Processor')
        cron.add(null, {
            repeat: { cron: '0 0 1-2 * * *' },
            jobId: 'resume-email',
        })
    }

    @Process()
    async process(job: Job) {
        this.logger.log('Resuming Email Service')
        await this.queueService.resume()
    }
}

Here's an example of a cron job that resume the email queue every 1-2 AM UTC if ever the quota has been reached.

from bull.

fwoelffel avatar fwoelffel commented on April 20, 2024 1

@smonv The queue can only be injected in the scope where BullModule has been registered. That's why you can't directly inject it in another module without wrapping it in a service that you export. This is the expected behavior.
Also I don't think this has anything to do with what @jayakusumah and @captainjapeng are reporting.

@captainjapeng might be right here. There seems to be a confusion between the name of the options and the name of the queue. I'll see what can be done to prevent this kind of error.

EDIT:
Well, @captainjapeng is actually right.

  • BullModule.register: the BullModuleOptions.name is used as the queue name and as the queue injection token also.
  • BullModule.registerAsync: the BullModuleAsyncOptions.name is used as the injection token and the BullModuleOptions.name is used as the queue name.

from bull.

fwoelffel avatar fwoelffel commented on April 20, 2024

@jayakusumah Thanks for reporting this

I'll try to look into this issue in the next few days. It'd be great if, in the meantime, you could provide some code reproducing this error, or even submit a PR with failing tests.

from bull.

smonv avatar smonv commented on April 20, 2024

I got the same problem: controllers in others module cannot inject queue defined in another module.

I tried exports processors, import queue defined module but no luck.

https://github.com/smonv/bull-queue-test here is code for quick setup demo the problem

Screen Shot 2019-09-22 at 13 39 43

from bull.

smonv avatar smonv commented on April 20, 2024

I found a workaround to solve this problem. Instead of directed inject queue inside controller, indirect inject queue by a service.

Create a task service inside QueueModule so naturally that service can inject queue. Export task service and let other controllers import it.

from bull.

captainjapeng avatar captainjapeng commented on April 20, 2024

Same issue, in my case I need to use registerAsync so that I can load my ConfigService to get redis credentials from.

from bull.

captainjapeng avatar captainjapeng commented on April 20, 2024

I think I've found the issue, when you use registerAsync it doesn't respect the name from the options and registering the ff instead of the name used in registerAsync
image

from bull.

adam-s avatar adam-s commented on April 20, 2024

I'm experiencing this same problem. Is there a work around at this moment?

from bull.

ratio91 avatar ratio91 commented on April 20, 2024

had the same issue.
really glad i found this thread here, otherwise there is no documentation yet.
It would be really great if it could be added to the readme. Thanks!

from bull.

maxymshg avatar maxymshg commented on April 20, 2024

Yes, you'll need to create a module to reexport the BullModule

Here's an example:

import { BullModule, BullModuleOptions } from 'nest-bull'
import { Module } from '@nestjs/common'

import { ConfigModule } from 'src/config/config.module'
import { ConfigService } from 'src/config/config.service'

function redisOptions(configService: ConfigService) {
  return {
    host: configService.getString('REDIS_HOST'),
    port: configService.getInt('REDIS_PORT'),
  }
}

const BullQueueModule = BullModule.registerAsync([
  {
    name: 'email',
    imports: [ConfigModule],
    useFactory: (configService: ConfigService): BullModuleOptions => {
      return {
        name: 'email',
        options: {
          redis: redisOptions(configService),
        },
      }
    },
    inject: [ConfigService],
  },
  {
    name: 'cron',
    imports: [ConfigModule],
    useFactory: (configService: ConfigService): BullModuleOptions => {
      return {
        name: 'cron',
        options: {
          redis: redisOptions(configService),
        },
      }
    },
    inject: [ConfigService],
  },
])

@Module({
  imports: [BullQueueModule],
  exports: [BullQueueModule],
})
export class QueueModule { }

Hi @captainjapeng ,

Could you please share full example with usage, I tried re-export but still got same error.

from bull.

maxymshg avatar maxymshg commented on April 20, 2024

Got it, thanks for sharing this.

from bull.

onbetelgeuse avatar onbetelgeuse commented on April 20, 2024

Hi, I tried it, but i have the same problem. When you give a name (@processor({ name: 'foo' }), this.moduleRef.get cannot find the object. But it work very well with @processor({ name: '' }) and InjectQueue('').

from bull.

kamilmysliwiec avatar kamilmysliwiec commented on April 20, 2024

Let's track this here #171

from bull.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.