promisify-child-process
seriously like the best async child process library
Based upon child-process-async
,
but more thorough, because that package doesn't seem very actively maintained.
promisify-child-process
provides a drop-in replacement for the
original child_process
functions, not just duplicate methods that
return a Promise
. So when you call exec(...)
we still return a
ChildProcess
instance, just with .then()
and .catch()
added to
make it promise-friendly.
Install and Set-up
npm install --save promisify-child-process
If you are using a old version of Node without built-in Promise
s or
Object.create
, you will need to use polyfills (e.g. @babel/polyfill
).
const { exec, spawn, fork, execFile } = require('child_process')
const { exec, spawn, fork, execFile } = require('promisify-child-process')
Upgrading to v3
You must now pass maxBuffer
or encoding
to spawn
/fork
if you want to
capture stdout
or stderr
.
Resolution/Rejection
The child process promise will only resolve if the process exits with a code of 0.
If it exits with any other code, is killed by a signal, or emits an 'error'
event,
the promise will reject.
Capturing output
exec
and execFile
capture stdout
and stderr
by default. But spawn
and
fork
don't capture stdout
and stderr
unless you pass an encoding
or
maxBuffer
option:
const { spawn } = require('promisify-child-process');
async function() {
const { stdout, stderr } = await spawn('ls', [ '-al' ], {encoding: 'utf8'});
const { stdout, stderr } = await spawn('ls', [ '-al' ], {maxBuffer: 200 * 1024});
const { stdout, stderr } = await spawn('ls', [ '-al' ]);
}
Additional properties on rejection errors
If the child process promise rejects, the error may have the following additional
properties:
code
- the process' exit code (if it exited)signal
- the signal the process was killed with (if it was killed)stdout
- the captured stdout
(if output capturing was enabled)stderr
- the captured stderr
(if output capturing was enabled)
Wrapper
If for any reason you need to wrap a ChildProcess
you didn't create,
you can use the exported promisifyChildProcess
function:
const { promisifyChildProcess } = require('promisify-child-process');
async function() {
const { stdout, stderr } = await promisifyChildProcess(
some3rdPartyFunctionThatReturnsChildProcess(),
{ encoding: 'utf8' }
)
}
Examples
exec()
async function() {
const { stdout, stderr } = await exec('ls -al');
const child = exec('ls -al', {});
child.stdin.write(...);
child.stdout.pipe(...);
child.stderr.on('data', (data) => ...);
const { stdout, stderr } = await child;
}
spawn()
async function() {
const { stdout, stderr, code } = await spawn('ls', [ '-al' ], {encoding: 'utf8'});
const child = spawn('ls', [ '-al' ], {});
child.stdin.write(...);
child.stdout.pipe(...);
child.stderr.on('data', (data) => ...);
const { stdout, stderr, code } = await child;
}