在挣扎到几乎变得沮丧之后,我找到了一个对我有用的解决方案。
我正在使用"@nestjs/bull": "^0.3.1"
, "bull": "^3.21.1"
。
因为来自公牛包的队列使用redis,所以尽管模块和应用程序关闭,它仍保持连接打开。
await moduleRef.close();
await app.close();
我意识到,在--detectOpenHandles
依赖leaked-handles
库获取更多信息的同时使用时,您会在控制台中看到类似这样的内容:
tcp stream {
fd: 20,
readable: true,
writable: false,
address: {},
serverAddr: null
}
tcp handle leaked at one of:
at /media/user/somePartitionName/Workspace/Nest/project-
name/node_modules/ioredis/built/connectors/StandaloneConnector.js:58:45
tcp stream {
fd: 22,
readable: true,
writable: true,
address: { address: '127.0.0.1', family: 'IPv4', port: 34876 },
serverAddr: null
}
解决方案
使用beforEach()
&afterEach()
- 在中
beforEach()
,添加此指令以获取队列的实例:
queue = moduleRef.get(getQueueToken("queuename"));
- 在
afterEach()
,像这样关闭队列:(也关闭你的应用程序和模块以获得更好的实践)
await queue.close();
笔记
使用beforAll()
&afterAll()
不起作用并且发生同样的问题,至少从我尝试过的情况来看,两者beforEach()
&afterEach()
工作结合在一起。