#1535·ioredis

如果设置了 commandTimeout 选项,在客户端断开连接时,不会清除活动定时器

作者: gregplaysguitar创建于 2022年3月18日更新于 2026年9月3日
标签bug

在设置了 commandTimeout 选项后,这里会设置一个定时器: https://GitHub.com/luin/ioredis/blob/eabb70ed835828ad85b602a217992486e05d2218/lib/Command.ts#L292-L300 这个定时器只在以下位置被清除: https://GitHub.com/luin/ioredis/blob/eabb70ed835828ad85b602a217992486e05d2218/lib/Command.ts#L349-L366 而 _that_ 只在命令成功解析时才会被调用... https://GitHub.com/luin/ioredis/blob/eabb70ed835828ad85b602a217992486e05d2218/lib/Command.ts#L302-L324 结果是,如果客户端在有活动的命令超时期间断开连接,那么在 nodejs 进程中就会出现一个孤立的定时器。在我这个情况下,这会导致测试和 Lambda 执行一直卡在定时器清除之前。可能的简单修复方法是在这里也清除定时器,以防止 promise 拒绝。但是,我对代码库不够熟悉,不知道这是否正确。如果维护者能够确认这是一个好主意,我可以开一个 PR 来实现: https://GitHub.com/luin/ioredis/blob/eabb70ed835828ad85b602a217992486e05d2218/lib/Command.ts#L315-L317