为什么AWS SDK会导致Jest出现Open Handle错误?
问题原因
你遇到的open handles错误和是否为无服务架构无关,是AWS SDK v2底层默认开启了HTTP连接池keep-alive,测试完成后存活的TCP连接没有被主动释放,被Jest的存活连接检测机制捕获导致的报错。
可选用的解决方法
方案1:测试结束后主动销毁SDK实例连接
在测试的afterAll/afterEach钩子中调用AWS服务实例的destroy()方法释放连接,你可以调整原有代码对外暴露Cognito实例,示例如下:
// 调整后的login实现 const login = (options) => { const cognito = new aws_sdk.CognitoIdentityServiceProvider(); const request = cognito.initiateAuth({ "AuthParameters": { "USERNAME": options.username, "PASSWORD": options.password, }, "ClientId": options.CLIENT_ID }); return { request, cognito }; };
// 测试文件中的清理逻辑 let testCognitoInstance; // 测试用例逻辑 test('login test', async () => { const { request, cognito } = login(testOptions); testCognitoInstance = cognito; // 原有测试断言逻辑 const res = await request.promise(); expect(res).toBeDefined(); }) afterAll(() => { // 销毁实例释放连接 testCognitoInstance?.destroy(); })
方案2:关闭AWS SDK的长连接配置
初始化AWS服务实例或者全局配置SDK时,关闭keep-alive agent,连接使用后会自动释放,无需额外清理逻辑:
// 单实例配置 const cognito = new aws_sdk.CognitoIdentityServiceProvider({ httpOptions: { agent: false } }); // 全局配置所有AWS服务生效 aws_sdk.config.update({ httpOptions: { agent: false } })
方案3:临时跳过Jest的open handles检测(不推荐)
如果只是临时跑测试不想修改业务/测试代码,可以在运行jest时添加参数关闭检测:jest --detectOpenHandles=false
也可以在jest.config.js中添加配置永久关闭:
module.exports = { detectOpenHandles: false }
该方案只是屏蔽报错,没有实际解决连接未释放的问题,仅适合临时调试使用。
内容的提问来源于stack exchange,提问作者Shadab Faiz
相关产品推荐
相关产品推荐

