javascript - Jest åbent håndtag når man bruger node exec?
Jeg har denne funktion, som jeg bruger til at kalde et commander-script:
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
});
}
);
});
}
Ved nogle kald logger Jest følgende:
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)
Skal jeg udføre en form for afslutning, når jeg bruger exec, så håndtaget bliver lukket?
For fuld kontekst er dette jest-testscriptet, der indeholder cli-funktionen.
Svar #1
Jeg støder på det samme problem, og det ser ud til, at du bør unref() ChildProcess. Det ser ud til, at kill() sender et afslutningssignal, men børneprocessen kommunikerer stadig med forældreprocessen, så den kommunikation bliver tilbage, og jest opdager det.
Ikke rigtig sikker på, om jeg forstår korrekt, hvordan alting fungerer, men i det mindste løste dette problemet for mig:
// 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
