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

NestJS中使用Bull MQ移除队列任务时出现Redis类型错误

NestJS + Bull MQ:Docker容器中调用.remove()删除定时任务报WRONGTYPE错误

问题场景

在NestJS项目中使用Bull处理包含延迟执行的定时任务,更新或删除调度时调用队列的.remove()方法,本地机器运行正常,但在Ubuntu的Docker容器中执行时触发Redis错误:

error: ReplyError: ERR Error running script (call to f_451d4221d6a7ff2251cd0864ab0a28bdba5ea099): @user_script:35: WRONGTYPE Operation against a key holding the wrong kind of value
    at parseError (/app/node_modules/redis-parser/lib/parser.js:179:12)
    at parseType (/app/node_modules/redis-parser/lib/parser.js:302:14) {
  command: {
    name: 'evalsha',
    args: [
      '451d4221d6a7ff2251cd0864ab0a28bdba5ea099',
      '10',
      'bull:flow:active',
      'bull:flow:wait',
      'bull:flow:delayed',
      'bull:flow:paused',
      'bull:flow:completed',
      'bull:flow:failed',
      'bull:flow:priority',
      'bull:flow:7',
      'bull:flow:7:logs',
      'bull:flow:limiter',
      '7',
      '32f0c492-4101-4ba0-ae31-4e46bebcfc9b'
    ]
  }
}

解决方案

1. 检查Redis队列key的类型一致性

这个错误的核心是Redis中某个Bull队列相关的key类型不符合脚本预期:

  • 进入Docker容器的Redis实例,执行TYPE bull:flow:7(替换为报错中出现的具体key,比如bull:flow:7),Bull的任务实例key应该是hash类型。
  • 如果返回类型不符,直接删除该key:DEL bull:flow:7,重启应用后测试。
  • 测试环境可彻底清理队列所有数据:DEL bull:flow:*,注意这会丢失所有未完成任务,生产环境需谨慎。

2. 对齐Bull和Redis版本

本地与Docker容器的依赖版本差异可能导致脚本兼容性问题:

  • 锁定package.json中bull/bullmq的版本号(去掉^或~前缀),确保容器安装的依赖与本地完全一致。
  • 检查Redis版本:本地和容器的Redis大版本需对齐(比如均为6.x或7.x),避免跨版本脚本执行异常。

3. 清理Docker Redis挂载的旧数据

容器中的Redis挂载卷可能残留旧项目数据,导致key类型异常:

  • 停止Redis容器,删除挂载的本地数据目录,重新启动容器生成干净的Redis数据。
  • 确认应用连接的是正确的Redis实例,避免误操作其他项目的Redis数据。

4. 校验队列初始化与任务操作逻辑

  • 确保NestJS中队列名称(此处为flow)在所有代码中拼写一致,避免操作错误的key。
  • 删除任务前调用.getJob()方法确认任务存在且状态正常,再执行.remove()。
  • 检查容器环境的时区配置,确保延迟任务的时间戳计算与本地一致,避免任务状态异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:32:09