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

为什么Jest无法正常退出?UDP套接字未关闭引发句柄残留问题

问题原因与解决方法

原因

  • 你在describe块的顶层直接创建了UDP套接字,这个操作会在测试套件初始化阶段就执行,套接字被创建后一直处于打开状态。
  • Node.js的UDP套接字底层对应UDPWRAP句柄,属于异步资源,只要它未被关闭,Node.js的事件循环就不会终止。Jest会监听事件循环状态,检测到未关闭的句柄时就会抛出这个警告。
  • 你的测试用例并没有使用这个套接字,但它已经被实例化并保持打开,所以测试通过后句柄依然存在,阻止Jest正常退出。

解决办法

方法一:用钩子管理套接字生命周期

在beforeAll中创建套接字,在afterAll中关闭它,确保测试结束后释放资源:

const dgram = require('node:dgram');

describe("udp client", () => {
    let testClient;

    beforeAll(() => {
        testClient = dgram.createSocket('udp6');
    });

    afterAll((done) => {
        // 关闭套接字并通过done告知Jest异步操作完成
        testClient.close(done);
    });

    test('test', () => {
        let popo = false;
        expect(popo).toEqual(false); 
    });
});

方法二:测试内部创建并即时关闭

如果测试不需要提前准备套接字,就在单个测试用例内部创建,用完后立即关闭:

const dgram = require('node:dgram');

describe("udp client", () => {
    test('test', (done) => {
        const testClient = dgram.createSocket('udp6');
        // 执行你的UDP相关测试逻辑
        let popo = false;
        expect(popo).toEqual(false); 
        // 测试完成后关闭套接字
        testClient.close(done);
    });
});

内容的提问来源于stack exchange,提问作者Hector Socarras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:22:27