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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 00:18:02