
Security News
AGENTS.md Gains Traction as an Open Format for AI Coding Agents
AGENTS.md is a fast-growing open format giving AI coding agents a shared, predictable way to understand project setup, style, and workflows.
promisify-child-process
Advanced tools
The promisify-child-process package is a utility that allows you to use Node.js child processes with promises, making it easier to work with asynchronous operations. It wraps the standard child process methods to return promises, enabling the use of async/await syntax for cleaner and more readable code.
Promisified exec
This feature allows you to execute shell commands using the exec function and handle the result with promises. The code sample demonstrates how to run the 'ls' command and handle its output using async/await.
const { exec } = require('promisify-child-process');
async function runCommand() {
try {
const { stdout, stderr } = await exec('ls');
console.log('Output:', stdout);
} catch (error) {
console.error('Error:', error);
}
}
runCommand();
Promisified spawn
This feature allows you to spawn a new process using the spawn function and handle its lifecycle with promises. The code sample demonstrates how to spawn a process to list directory contents and handle its output and errors.
const { spawn } = require('promisify-child-process');
async function runSpawn() {
const child = spawn('ls', ['-lh', '/usr']);
child.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
try {
await child;
console.log('Process completed');
} catch (error) {
console.error('Error:', error);
}
}
runSpawn();
The child-process-promise package provides similar functionality by wrapping Node.js child process methods with promises. It offers a similar API for exec and spawn, allowing for promise-based handling of child processes. Compared to promisify-child-process, it also focuses on providing a promise-based interface but may have different implementation details and additional features.
Execa is a higher-level wrapper around child processes that provides a promise-based API. It offers more features than promisify-child-process, such as improved error handling, cross-platform compatibility, and additional options for running commands. Execa is often preferred for more complex use cases due to its extensive feature set.
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()
, .catch()
, and .finally()
added to
make it promise-friendly.
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
).
// OLD:
const { exec, spawn, fork, execFile } = require('child_process')
// NEW:
const { exec, spawn, fork, execFile } = require('promisify-child-process')
You must now pass maxBuffer
or encoding
to spawn
/fork
if you want to
capture stdout
or stderr
.
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.
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() {
// captures output
const { stdout, stderr } = await spawn('ls', [ '-al' ], {encoding: 'utf8'});
const { stdout, stderr } = await spawn('ls', [ '-al' ], {maxBuffer: 200 * 1024});
// BUG, DOESN'T CAPTURE OUTPUT:
const { stdout, stderr } = await spawn('ls', [ '-al' ]);
}
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)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' }
)
}
exec()
async function() {
const { stdout, stderr } = await exec('ls -al');
// OR:
const child = exec('ls -al', {});
// do whatever you want with `child` here - it's a ChildProcess instance just
// with promise-friendly `.then()` & `.catch()` functions added to it!
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'});
// OR:
const child = spawn('ls', [ '-al' ], {});
// do whatever you want with `child` here - it's a ChildProcess instance just
// with promise-friendly `.then()` & `.catch()` functions added to it!
child.stdin.write(...);
child.stdout.pipe(...);
child.stderr.on('data', (data) => ...);
const { stdout, stderr, code } = await child;
}
FAQs
seriously like the best async child process library
We found that promisify-child-process demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
AGENTS.md is a fast-growing open format giving AI coding agents a shared, predictable way to understand project setup, style, and workflows.
Security News
/Research
Malicious npm package impersonates Nodemailer and drains wallets by hijacking crypto transactions across multiple blockchains.
Security News
This episode explores the hard problem of reachability analysis, from static analysis limits to handling dynamic languages and massive dependency trees.