Have you ever stumbled upon this error when using spawn
from Node.js' child_process
module?
Terminal
~/demo $ node main.js~/demo/main.js:10throw err;^Error: spawn node ENOENTat Process.ChildProcess._handle.onexit (internal/child_process.js:264:19)at onErrorNT (internal/child_process.js:456:16)at processTicksAndRejections (internal/process/task_queues.js:77:11)
I keep running into this error over and over again. And what confuses me every time is that I could always swear that the given piece of code was working before.
JS
const { spawn } = require('child_process')// ✅ This works:spawn('node', ['script.js'])
It turns out that when you pass in options.env
as the third argument to set an environment variable
on the child process, the error appears:
JS
const { spawn } = require('child_process')// ❌ This doesn't work:spawn('node', ['script.js'], {env: { NODE_ENV: 'production' },})
To fix it, simply pass along the PATH
environment variable from the parent process as well:
JS
const { spawn } = require('child_process')// ✅ This works:spawn('node', ['script.js'], {env: {NODE_ENV: 'production',PATH: process.env.PATH,},})
The reason the spawn
was broken in the first place was because we were overriding the child process' environment
variables in options.env
which it normally would have inherited from its parent process.
So without the PATH
environment variable, the operating system doesn't know where to look for the node
executable.
I hope this helped!