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
相关产品推荐
相关产品推荐

