You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ts.ED BullMQ插件初始化报错:服务器启动后执行任务失败

Ts.ED中使用BullMQ插件启动后立即执行任务的问题解决

问题描述

我是Ts.ED新手,想要使用BullMQ插件,希望在服务器启动后立即执行一个任务。我编写了如下代码:

import { JobDispatchService } from "./services/jobDispatchService";
import { PlatformApplication, Inject, Configuration, $log } from "@tsed/common";

export class Server {
  @Inject()
  app: PlatformApplication;

  @Inject()
  dispatcher: JobDispatchService;

  @Configuration()
  settings: Configuration;

  $beforeRoutesInit(): void {
    this.app
      .use(URLMiddleware)
      .use(cors())
      .use(cookieParser())
      .use(compress({}))
      .use(methodOverride())
      .use(bodyParser.json())
      .use(
        bodyParser.urlencoded({
          extended: true
        })
      );
  }

  $afterRoutesInit(): void {
    $log.error("after init");
    console.log("should check notif");
    this.dispatcher.doingSomething()
  }
}

启动服务器时出现如下错误:

[2023-12-15T01:09:33.035] [DEBUG] [TSED] - Start server...
[2023-12-15T01:09:33.043] [INFO ] [TSED] - Injector created... +6ms
[2023-12-15T01:09:35.022] [INFO ] [TSED] - Providers loaded... +1979ms
[2023-12-15T01:09:35.022] [INFO ] [TSED] - Build providers +0ms
query: SELECT * FROM current_schema()
query: SHOW server_version;
[2023-12-15T01:09:35.106] [INFO ] [TSED] - Connected with typeorm to database: default
[2023-12-15T01:09:35.142] [ERROR] [TSED] - TypeError: this.injector.getMany is not a function
    at BullMQModule.$beforeInit (/home//dashboard/packages/aservice/node_modules/@tsed/bullmq/src/BullMQModule.ts:28:19)
    at LocalsContainer.emit (/home//dashboard/packages/aservice/node_modules/@tsed/di/src/domain/LocalsContainer.ts:12:13)
    at InjectorService.load (/home//dashboard/packages/aservice/node_modules/@tsed/di/src/services/InjectorService.ts:313:18)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at PlatformBuilder.loadInjector (/home//dashboard/packages/aservice/node_modules/@tsed/common/src/builder/PlatformBuilder.ts:202:5)
    at PlatformBuilder.runLifecycle (/home//dashboard/packages/aservice/node_modules/@tsed/common/src/builder/PlatformBuilder.ts:180:5)
    at bootstrap (/home//dashboard/packages/aservice/src/index.ts:8:22)

解决方案

1. 修复版本兼容性问题

报错TypeError: this.injector.getMany is not a function是因为@tsed/bullmq版本与Ts.ED核心包(如@tsed/common、@tsed/core)版本不匹配导致的:

  • 执行npm ls @tsed/core查看核心包版本
  • 安装对应版本的@tsed/bullmq:npm install @tsed/bullmq@<你的核心版本号>

2. 正确配置BullMQ模块

确保在Server类的@Configuration装饰器中注册BullMQ模块,并配置Redis连接:

import { Configuration } from "@tsed/di";
import { BullMQModule } from "@tsed/bullmq";

@Configuration({
  imports: [
    BullMQModule.forRoot({
      connection: {
        host: "localhost", // 你的Redis地址
        port: 6379 // 你的Redis端口
      }
    })
  ]
})
export class Server {
  // ... 其他代码
}

3. 使用正确的生命周期钩子

不要在$afterRoutesInit中调用任务调度,改用$onServerReady钩子——这个钩子会在服务器完全启动、所有模块初始化完成后触发:

// 修改Server类中的生命周期方法
async $onServerReady(): Promise<void> {
  $log.info("服务器已启动,开始执行初始化任务");
  try {
    await this.dispatcher.doingSomething();
    $log.info("初始化任务执行完成");
  } catch (error) {
    $log.error("初始化任务执行失败", error);
  }
}

4. 确保任务调度服务正确注入队列

你的JobDispatchService需要正确注入BullMQ队列:

import { Service, Inject } from "@tsed/di";
import { Queue } from "bullmq";

@Service()
export class JobDispatchService {
  @Inject("myQueue") // 队列名称需与你定义的一致
  private queue: Queue;

  async doingSomething() {
    // 向队列添加任务
    await this.queue.add("init-job", { payload: "初始化任务数据" });
  }
}

内容的提问来源于stack exchange,提问作者sickdevrn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:42:50