Jest.js 使用节点执行时是否打开句柄?

but5z9lq  于 2023-03-27  发布在  Jest
关注(0)|答案(1)|浏览(129)

我有一个函数,我用它来调用一个命令脚本:

function cli(args, cwd) {
    return new Promise(resolve => {
        exec(
        `node ${path.resolve("./index")} ${args.join(" ")}`,
        { cwd },
        (error, stdout, stderr) => {
            resolve({
            code: error && error.code ? error.code : 0,
            error,
            stdout,
            stderr
            });
        }
        );
    });
    }

在一些调用中,Jest会记录以下内容:

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

    ●  PROCESSWRAP

        255 | function cli(args, cwd) {
        256 |   return new Promise(resolve => {
        > 257 |     exec(
            |     ^
        258 |       `node ${path.resolve("./index")} ${args.join(" ")}`,
        259 |       { cwd },
        260 |       (error, stdout, stderr) => {

        at exec (index.spec.js:257:5)
        at cli (index.spec.js:256:10)
        at Object.cli (index.spec.js:89:24)

在使用exec时,我是否需要执行某种类型的终结,以使句柄关闭?
对于完整上下文this is the jest test script that contains the cli function

xoefb8l8

xoefb8l81#

我遇到了同样的问题,看起来你应该unref()子进程。看起来kill()发送了一个终止信号,但子进程仍然与父进程通信,因此通信被遗留下来,jest正在检测。
不确定我是否正确理解了一切是如何工作的,但至少这为我解决了这个问题:

// FIXES PIPEWRAP open handle
child_process.stdout.destroy()
child_process.stderr.destroy()
child_process.stdin.destroy()

// FIXES PROCESSWRAP open handle
child_process.kill() // (Optional: Just if you want to kill the process)
child_process.unref() // Necessary: fixes PROCESSWRAP

相关问题