Cuando recibo el siguiente error:
events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
¿Qué procedimiento puedo seguir para solucionarlo?
Nota del autor : Muchos problemas con este error me animaron a publicar esta pregunta para futuras referencias.
Preguntas relacionadas:
- usando la función spawn con NODE_ENV = producción
- node.js child_process.spawn Error ENOENT - solo bajo supervisión
- spawn ENOENT error node.js
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Nodo JS: la generación de proceso hijo ('npm install') en la tarea Grunt produce un error ENOENT
- Ejecutando tarea "capataz" Error fatal: engendrar ENOENT
- evento de error no controlado en el nodo js Error: genera ENOENT en errnoException (child_process.js: 975: 11)
- Node.js SpookyJS: error al ejecutar hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Ejecute el archivo exe con Child Process NodeJS
- Nodo: child_process.spawn no funciona en Java aunque esté en la ruta (ENOENT)
- generar ENOENT error con NodeJS (relacionado con PYTHON)
- el cambio de tamaño de la imagen no funciona en node.js (partial.js) (dependencia no instalada)
- npm error de instalación ENOENT (problema de dependencia de compilación)
- No se puede instalar node.js - módulo oracle en Windows 7 (problema de dependencia de compilación)
- Error al instalar Gulp usando nodejs en Windows (caso extraño)
node.js
debugging
error-handling
child-process
spawn
laconbass
fuente
fuente
exec
lugar de pasar el comando como primer argumento y las opciones como una matriz para el segundo argumento. Por ejemplo, estaba haciendo enspawn( "adb logcat -c" )
lugar despawn( "adb", [ "logcat", "-c" ] )
.Respuestas:
NOTA: Este error casi siempre se debe a que el comando no existe, porque el directorio de trabajo no existe o por un error solo de Windows.
Encontré una manera fácil y particular de tener la idea de la causa raíz de:
El problema de este error es que hay muy poca información en el mensaje de error que le indique dónde se encuentra el sitio de la llamada, es decir, qué ejecutable / comando no se encuentra, especialmente cuando tiene una base de código grande donde hay muchas llamadas engendradas . Por otro lado, si conocemos el comando exacto que causa el error, entonces podemos seguir la respuesta de @laconbass para solucionar el problema.
Encontré una manera muy fácil de detectar qué comando causa el problema en lugar de agregar oyentes de eventos en todo el código, como se sugiere en la respuesta de @laconbass. La idea clave es ajustar la llamada de generación original con un contenedor que imprime los argumentos enviados a la llamada de generación.
Aquí está la función de contenedor, colóquela en la parte superior del
index.js
script de inicio de su servidor o lo que sea.Luego, la próxima vez que ejecute su aplicación, antes del mensaje de excepción no detectada, verá algo así:
De esta manera, puede saber fácilmente qué comando se ejecuta realmente y luego puede descubrir por qué nodejs no puede encontrar el ejecutable para solucionar el problema.
fuente
spawn()
aexec()
e inténtelo de nuevo.exec()
le dirá qué comando intentó ejecutar.Paso 1: asegúrese de que
spawn
se llame de la manera correctaPrimero, revise los documentos para child_process.spawn (comando, argumentos, opciones) :
Asegúrese de no poner ningún argumento en la línea de comandos
command
y toda laspawn
llamada es válida . Proceda al siguiente paso.Paso 2: identifique el emisor de eventos que emite el evento de error
Busque en su código fuente cada llamada a
spawn
, ochild_process.spawn
, es decir,y adjunte un detector de eventos para el evento 'error', de modo que se note el Emisor de eventos exacto que lo está arrojando como 'No controlado'. Después de la depuración, ese controlador puede eliminarse.
Ejecute y debería obtener la ruta del archivo y el número de línea donde se registró su escucha de 'error'. Algo como:
Si las dos primeras líneas siguen siendo
repita este paso hasta que no lo estén. Debe identificar al oyente que emite el error antes de continuar con el siguiente paso.
Paso 3: asegúrese de que la variable de entorno
$PATH
esté configuradaHay dos escenarios posibles:
spawn
comportamiento predeterminado , por lo que el entorno de proceso secundario será el mismo queprocess.env
.env
objeto aspawn
en eloptions
argumento.En ambos escenarios, debe inspeccionar la
PATH
clave en el objeto de entorno que utilizará el proceso secundario generado.Ejemplo para el escenario 1
Ejemplo para el escenario 2
La ausencia de
PATH
(es decir, esundefined
) haráspawn
que se emita elENOENT
error , ya que no será posible localizar ninguno acommand
menos que sea una ruta absoluta al archivo ejecutable.Cuando
PATH
está configurado correctamente, continúe con el siguiente paso. Debe ser un directorio o una lista de directorios. El último caso es el habitual.Paso 4: asegúrese de que
command
exista en un directorio de los definidos enPATH
Spawn puede emitir el
ENOENT
error si el nombre de archivocommand
(es decir, 'algún comando') no existe en al menos uno de los directorios definidos enPATH
.Localice el lugar exacto de
command
. En la mayoría de las distribuciones de Linux, esto se puede hacer desde una terminal con elwhich
comando. Le indicará la ruta absoluta al archivo ejecutable (como arriba), o le indicará si no se encuentra.Ejemplo de uso de cuál y su salida cuando se encuentra un comando
Ejemplo de uso de cuál y su salida cuando no se encuentra un comando
Los programas mal instalados son la causa más común de un comando no encontrado . Consulte la documentación de cada comando si es necesario e instálelo.
Cuando el comando es un archivo de script simple, asegúrese de que sea accesible desde un directorio en el
PATH
. Si no es así, muévalo a uno o haga un enlace a él.Una vez que determine que
PATH
está configurado correctamente ycommand
es accesible desde él, debería poder generar el proceso de su hijo sinspawn ENOENT
ser arrojado.fuente
cwd
en las opciones, pero el directorio dado no existe.spawn('some-command', ['--help'], { env: env });
como se ejemplifica en el paso 3 en esta respuesta y está pasando un entorno personalizado, asegúrese de especificar elPATH
, por ejemplo:{ env: { PATH: process.env.PATH } }
. La opción env no heredará las variables de su env actual por defecto.shell: true
a las opciones de generación.Como lo señaló @DanielImfeld , ENOENT se generará si especifica "cwd" en las opciones, pero el directorio dado no existe.
fuente
cwd
ruta: 'c: / ...' y no solo '/ ...'Solución de Windows: Reemplazar
spawn
con nodo-cross-spawn . Por ejemplo, así al principio de tu app.js:fuente
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
La respuesta de @ laconbass me ayudó y probablemente sea la más correcta.
Vine aquí porque estaba usando spawn incorrectamente. Como un simple ejemplo:
Esto es incorrecto:
Esto es incorrecto:
esto es correcto:
Sin embargo, recomiendo hacerlo de esta manera:
Esto se debe a que el
cp.on('exit', fn)
evento siempre se disparará, siempre y cuando bash esté instalado, de lo contrario, elcp.on('error', fn)
evento podría dispararse primero, si lo usamos de la primera manera, si lanzamos 'npm' directamente.fuente
child_process.exec
o pasarshell: true
aspawn
.Para ENOENT en Windows, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 corríjalo.
por ejemplo, reemplazar spawn ('npm', ['-v'], {stdio: 'heredar'}) con:
para todas las versiones de node.js:
para node.js 5.xy posterior:
fuente
shell: true
Para cualquiera que pueda tropezar con esto, si todas las otras respuestas no ayudan y usted está en Windows, sepa que actualmente hay un gran problema con
spawn
Windows y laPATHEXT
variable de entorno que puede hacer que ciertas llamadas se generen para que no funcionen, dependiendo de cómo El comando de destino está instalado.fuente
spawn
y simplemente usé en suexec
lugar.En mi caso, recibí este error debido a que no se instalaron los recursos del sistema dependientes necesarios.
Más específicamente, tengo una aplicación NodeJS que está utilizando ImageMagick. A pesar de tener instalado el paquete npm, el núcleo Linux ImageMagick no estaba instalado. Hice un apt-get para instalar ImageMagick y después de eso todo funcionó muy bien.
fuente
en windows, simplemente agregar la
shell: true
opción resolvió mi problema:incorrecto:
correcto:
fuente
¿Estás cambiando la
env
opción?Entonces mira esta respuesta.
Estaba tratando de generar un proceso de nodo y TIL que debería difundir las variables de entorno existentes cuando genera, de lo contrario perderá la
PATH
variable de entorno y posiblemente otras importantes.Esta fue la solución para mí:
fuente
Antes de que alguien pase mucho tiempo depurando este problema, la mayoría de las veces se puede resolver eliminando
node_modules
y reinstalando los paquetes.Instalar:
Si existe un archivo de bloqueo, puede usar
o
respetuosamente si no entonces
o
fuente
Me encontré con el mismo problema, pero encontré una manera simple de solucionarlo. Parece que hay
spawn()
errores si el usuario ha agregado el programa a la RUTA (por ejemplo, los comandos normales del sistema funcionan).Para solucionar esto, puede usar el módulo which (
npm install --save which
):fuente
¡Use en
require('child_process').exec
lugar de generar para un mensaje de error más específico!por ejemplo:
fuente
Asegúrese de que el módulo a ejecutar esté instalado o la ruta completa al comando si no es un módulo de nodo
fuente
También estaba pasando por este molesto problema mientras ejecutaba mis casos de prueba, así que intenté muchas formas de superarlo. Pero la forma en que funciona para mí es ejecutar su corredor de prueba desde el directorio que contiene su archivo principal que incluye su función de generación de nodejs algo como esto:
Por ejemplo, este nombre de archivo es test.js , así que simplemente muévase a la carpeta que lo contiene . En mi caso, es una carpeta de prueba como esta:
luego de ejecutar su corredor de prueba en mi caso, es moca, así será así:
He perdido más de un día para resolverlo. ¡¡Disfrutar!!
fuente
Me encontré con este problema en Windows, donde llamar
exec
yspawn
con exactamente el mismo comando (omitir argumentos) funcionó bienexec
(así que sabía que mi comando estaba activado$PATH
), perospawn
daría ENOENT. Resultó que solo necesitaba agregar.exe
el comando que estaba usando:fuente
Recibía este error cuando intentaba depurar un programa node.js desde el editor VS Code en un sistema Debian Linux. Noté que lo mismo funcionaba bien en Windows. Las soluciones dadas anteriormente aquí no fueron de mucha ayuda porque no había escrito ningún comando de "spawn". El código ofensivo fue presumiblemente escrito por Microsoft y oculto bajo el capó del programa VS Code.
Luego noté que node.js se llama nodo en Windows pero en Debian (y presumiblemente en sistemas basados en Debian como Ubuntu) se llama nodejs. Así que creé un alias: desde un terminal raíz, ejecuté
ln -s / usr / bin / nodejs / usr / local / bin / node
Y esto resolvió el problema. Presumiblemente, el mismo procedimiento o uno similar funcionará en otros casos donde su node.js se llama nodejs pero está ejecutando un programa que espera que se llame nodo, o viceversa.
fuente
Si está en Windows Node.js hace algunos negocios divertidos cuando maneja citas que pueden resultar en que emita un comando que sabe que funciona desde la consola, pero no cuando se ejecuta en Node. Por ejemplo, lo siguiente debería funcionar:
pero falla Hay una opción fantásticamente indocumentada
windowsVerbatimArguments
para manejar citas / similares que parece ser el truco, solo asegúrese de agregar lo siguiente a su objeto de opciones:y tu comando debería estar de vuelta en el negocio.
fuente
solución en mi caso
fuente
.cmd
, pero falla en una prueba de broma mecanografiada. - Este error puede ser bastante difícil de entender, esta respuesta merece más votos a favor.En caso de que experimente este problema con una aplicación cuyo origen no puede modificar, considere invocarlo con la variable de entorno
NODE_DEBUG
establecidachild_process
, por ejemploNODE_DEBUG=child_process yarn test
. Esto le proporcionará información sobre qué líneas de comando se han invocado en qué directorio y, por lo general, el último detalle es el motivo del error.fuente
Aunque puede ser una ruta de entorno u otro problema para algunas personas, acabo de instalar la extensión Latex Workshop para Visual Studio Code en Windows 10 y vi este error al intentar construir / previsualizar el PDF. Ejecutar VS Code como administrador me resolvió el problema.
fuente
Obtuve el mismo error para Windows 8. El problema se debe a que falta una variable de entorno de la ruta del sistema. Agregue el valor "C: \ Windows \ System32 \" a la variable PATH de su sistema.
fuente
Agregar
C:\Windows\System32\
a lapath
variable de entorno.Pasos
Ir a mi computadora y propiedades
Haga clic en Configuración avanzada
Luego en variables de entorno
Seleccione
Path
y luego haga clic en editarPegue lo siguiente si aún no está presente:
C:\Windows\System32\
Cerrar el símbolo del sistema
Ejecute el comando que desea ejecutar
fuente