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

