Lorsque j'obtiens l'erreur suivante:
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)
Quelle procédure puis-je suivre pour le réparer?
Note de l'auteur : Beaucoup de problèmes avec cette erreur m'ont encouragé à poster cette question pour de futures références.
Questions connexes:
- en utilisant la fonction d'apparition avec NODE_ENV = production
- node.js child_process.spawn Erreur ENOENT - uniquement sous supervord
- erreur spawn ENOENT node.js
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Node JS - le spawn child_process ('npm install') dans la tâche Grunt entraîne une erreur ENOENT
- Exécution de la tâche "contremaître" Erreur fatale: apparition ENOENT
- événement d'erreur non géré dans le noeud js Erreur: spawn ENOENT at errnoException (child_process.js: 975: 11)
- Node.js SpookyJS: erreur lors de l'exécution de hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Exécuter le fichier exe avec le processus enfant NodeJS
- Node: child_process.spawn ne fonctionne pas sur Java même s'il est dans le chemin (ENOENT)
- spawn ENOENT error with NodeJS (PYTHON related)
- le redimensionnement d'image ne fonctionne pas dans node.js (partial.js) (dépendance non installée)
- erreur d'installation npm ENOENT (problème de dépendance de génération)
- Impossible d'installer node.js - module Oracle sur Windows 7 (problème de dépendance de build)
- Erreur lors de l'installation de Gulp à l'aide de nodejs sur Windows (cas étrange)
node.js
debugging
error-handling
child-process
spawn
laconbass
la source
la source
exec
au lieu de passer la commande comme premier argument et les options comme tableau pour le deuxième argument. par exemple, je faisaisspawn( "adb logcat -c" )
au lieu despawn( "adb", [ "logcat", "-c" ] )
.Réponses:
Remarque: cette erreur est presque toujours provoquée parce que la commande n'existe pas, parce que le répertoire de travail n'existe pas ou à partir d'un bogue Windows uniquement.
J'ai trouvé un moyen particulièrement simple de se faire une idée de la cause première de:
Le problème de cette erreur est qu'il y a vraiment peu d'informations dans le message d'erreur pour vous dire où se trouve le site d'appel, c'est-à-dire quel exécutable / commande est introuvable, surtout lorsque vous avez une grande base de code où il y a beaucoup d'appels d'apparition . D'un autre côté, si nous connaissons la commande exacte à l'origine de l'erreur, nous pouvons suivre la réponse de @laconbass pour résoudre le problème.
J'ai trouvé un moyen très facile de repérer la commande à l'origine du problème plutôt que d'ajouter des écouteurs d'événements partout dans votre code, comme suggéré dans la réponse de @laconbass. L'idée clé est d'encapsuler l'appel de spawn d'origine avec un wrapper qui affiche les arguments envoyés à l'appel de spawn.
Voici la fonction wrapper, placez-la en haut du
index.js
ou quel que soit le script de démarrage de votre serveur.Ensuite, la prochaine fois que vous exécuterez votre application, avant le message de l'exception non capturée, vous verrez quelque chose comme ça:
De cette façon, vous pouvez facilement savoir quelle commande est réellement exécutée, puis vous pouvez découvrir pourquoi nodejs ne peut pas trouver l'exécutable pour résoudre le problème.
la source
spawn()
àexec()
et réessayez.exec()
vous dira quelle commande il a essayé d'exécuter.Étape 1: Assurez
spawn
- vous que le nom est le bonTout d'abord, passez en revue les documents pour child_process.spawn (commande, arguments, options) :
Assurez-vous de ne pas insérer d'arguments de ligne de commande
command
et que l'spawn
appel entier est valide . Passez à l'étape suivante.Étape 2: identifier l'émetteur d'événements qui émet l'événement d'erreur
Recherche sur votre code source pour chaque appel à
spawn
, ouchild_process.spawn
, par exempleet attachez-y un écouteur d'événement pour l'événement «erreur», afin que vous remarquiez l'émetteur d'événement exact qui le lance comme «non géré». Après le débogage, ce gestionnaire peut être supprimé.
Exécutez et vous devriez obtenir le chemin du fichier et le numéro de ligne où votre écouteur "d'erreur" a été enregistré. Quelque chose comme:
Si les deux premières lignes sont toujours
recommencez cette étape jusqu'à ce qu'ils ne le soient pas. Vous devez identifier l'écouteur qui émet l'erreur avant de passer à l'étape suivante.
Étape 3: assurez-vous que la variable d'environnement
$PATH
est définieIl existe deux scénarios possibles:
spawn
comportement par défaut , donc l'environnement de processus enfant sera le même queprocess.env
.env
objet àspawn
l'options
argument.Dans les deux scénarios, vous devez inspecter la
PATH
clé de l'objet d'environnement que le processus enfant généré utilisera.Exemple pour le scénario 1
Exemple pour le scénario 2
L'absence de
PATH
(c'est-à-dire, c'estundefined
) provoquera l'émissionspawn
de l'ENOENT
erreur , car il ne sera pas possible de localiser toutcommand
sauf s'il s'agit d'un chemin absolu vers le fichier exécutable.Lorsque
PATH
est correctement réglé, passez à l'étape suivante. Il doit s'agir d'un répertoire ou d'une liste de répertoires. Le dernier cas est l'habituel.Étape 4: Assurez-vous qu'il
command
existe sur un répertoire de ceux définis dansPATH
Spawn peut émettre l'
ENOENT
erreur si le nom de fichiercommand
(c'est-à-dire, 'some-command') n'existe pas dans au moins un des répertoires définis surPATH
.Localisez l'endroit exact de
command
. Sur la plupart des distributions Linux, cela peut être fait à partir d'un terminal avec lawhich
commande. Il vous indiquera le chemin absolu vers le fichier exécutable (comme ci-dessus), ou dira s'il n'est pas trouvé.Exemple d'utilisation de laquelle et de sa sortie lorsqu'une commande est trouvée
Exemple d'utilisation de laquelle et de sa sortie lorsqu'une commande n'est pas trouvée
les programmes mal installés sont la cause la plus courante d'une commande introuvable . Reportez-vous à la documentation de chaque commande si nécessaire et installez-la.
Lorsque la commande est un simple fichier de script, assurez-vous qu'elle est accessible à partir d'un répertoire sur le
PATH
. Si ce n'est pas le cas, déplacez-le vers l'un ou faites un lien vers celui-ci.Une fois que vous avez déterminé qu'il
PATH
est correctement défini et qu'ilcommand
est accessible à partir de celui-ci, vous devriez pouvoir générer votre processus enfant sansspawn ENOENT
être jeté.la source
cwd
dans les options, mais le répertoire donné n'existe pas.spawn('some-command', ['--help'], { env: env });
comme illustré par l' étape 3 dans cette réponse et passez un environnement personnalisé, assurez - vous de spécifier lePATH
, par exemple:{ env: { PATH: process.env.PATH } }
. L'option env n'héritera pas les variables de votre env actuel par défaut.shell: true
aux options d'apparition.Comme l'a souligné @DanielImfeld , ENOENT sera lancé si vous spécifiez "cwd" dans les options, mais le répertoire donné n'existe pas.
la source
cwd
chemin: 'c: / ...' et pas seulement '/ ...'Solution Windows: remplacer
spawn
par node-cross-spawn . Par exemple, comme ceci au début de votre app.js:la source
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
La réponse de @ laconbass m'a aidé et est probablement la plus correcte.
Je suis venu ici parce que j'utilisais incorrectement le spawn. Comme exemple simple:
Ceci est une erreur:
Ceci est une erreur:
c'est correct:
cependant, je recommande de le faire de cette façon:
cela est dû au fait que l'
cp.on('exit', fn)
événement se déclenchera toujours, tant que bash est installé, sinon, l'cp.on('error', fn)
événement peut se déclencher en premier, si nous l'utilisons de la première manière, si nous lançons directement 'npm'.la source
child_process.exec
ou passershell: true
àspawn
.Pour ENOENT sous Windows, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 le corrige.
par exemple remplacer spawn ('npm', ['-v'], {stdio: 'inherit'}) par:
pour toutes les versions de node.js:
pour node.js 5.x et versions ultérieures:
la source
shell: true
Pour tous ceux qui pourraient tomber dessus, si toutes les autres réponses ne vous aident pas et que vous êtes sous Windows, sachez qu'il existe actuellement un gros problème avec
spawn
sous Windows et laPATHEXT
variable d'environnement qui peut entraîner le rejet de certains appels selon la façon dont la commande cible est installée.la source
spawn
juste utilisé à laexec
place.Dans mon cas, je recevais cette erreur car les ressources système dépendantes nécessaires n'étaient pas installées.
Plus précisément, j'ai une application NodeJS qui utilise ImageMagick. Bien que le package npm soit installé, le noyau Linux ImageMagick n'a pas été installé. J'ai fait un apt-get pour installer ImageMagick et après cela tout a bien fonctionné!
la source
dans les fenêtres, ajouter simplement une
shell: true
option a résolu mon problème:Incorrect:
correct:
la source
Modifiez-vous l'
env
option?Regardez ensuite cette réponse.
J'essayais de générer un processus de nœud et TIL que vous devriez répartir les variables d'environnement existantes lorsque vous générez sinon vous perdrez le
PATH
variable d'environnement et éventuellement d'autres importantes.C'était la solution pour moi:
la source
Avant que quiconque ne passe trop de temps à déboguer ce problème, la plupart du temps, il peut être résolu en supprimant
node_modules
et en réinstallant les packages.À installer:
Si un fichier de verrouillage existe, vous pouvez utiliser
ou
respectivement. sinon
ou
la source
J'ai rencontré le même problème, mais j'ai trouvé un moyen simple de le résoudre. Il semble y avoir des
spawn()
erreurs si le programme a été ajouté au PATH par l'utilisateur (par exemple, les commandes système normales fonctionnent).Pour résoudre ce problème, vous pouvez utiliser le module which (
npm install --save which
):la source
Utilisez
require('child_process').exec
au lieu de spawn pour un message d'erreur plus spécifique!par exemple:
la source
Assurez-vous que le module à exécuter est installé ou le chemin d'accès complet à la commande s'il ne s'agit pas d'un module de nœud
la source
Je traversais également ce problème ennuyeux lors de l'exécution de mes cas de test, j'ai donc essayé de nombreuses façons de le contourner. Mais la façon dont cela fonctionne pour moi est d' exécuter votre lanceur de test à partir du répertoire qui contient votre fichier principal qui inclut votre fonction de génération de nodejs quelque chose comme ceci:
Par exemple, ce nom de fichier est test.js , alors déplacez-vous simplement vers le dossier qui le contient . Dans mon cas, c'est un dossier de test comme celui-ci:
puis exécutez votre testeur dans mon cas, son moka donc ce sera comme ceci:
J'ai perdu plus d'une journée pour le comprendre. Prendre plaisir!!
la source
J'ai rencontré ce problème sous Windows, où appeler
exec
etspawn
avec exactement la même commande (en omettant les arguments) fonctionnait bienexec
(donc je savais que ma commande était activée$PATH
), maisspawn
donnerait ENOENT. Il s'est avéré que je devais juste ajouter.exe
à la commande que j'utilisais:la source
J'obtenais cette erreur lorsque j'essayais de déboguer un programme node.js depuis l'éditeur VS Code sur un système Linux Debian. J'ai remarqué que la même chose fonctionnait bien sous Windows. Les solutions précédemment données ici ne m'ont pas beaucoup aidé car je n'avais écrit aucune commande "spawn". Le code incriminé a probablement été écrit par Microsoft et caché sous le capot du programme VS Code.
Ensuite, j'ai remarqué que node.js est appelé node sur Windows mais sur Debian (et probablement sur les systèmes basés sur Debian tels que Ubuntu) il s'appelle nodejs. J'ai donc créé un alias - à partir d'un terminal racine, j'ai couru
ln -s / usr / bin / nodejs / usr / local / bin / node
et cela a résolu le problème. La même procédure ou une procédure similaire fonctionnera probablement dans d'autres cas où votre node.js est appelé nodejs mais vous exécutez un programme qui s'attend à ce qu'il soit appelé node, ou vice-versa.
la source
Si vous êtes sous Windows, Node.js fait des affaires drôles lors de la gestion des devis qui peuvent vous amener à émettre une commande dont vous savez qu'elle fonctionne à partir de la console, mais pas lorsqu'elle est exécutée dans Node. Par exemple, les éléments suivants devraient fonctionner:
mais échoue. Il existe une option incroyablement non documentée
windowsVerbatimArguments
pour gérer les guillemets / similaires qui semble faire l'affaire, assurez-vous simplement d'ajouter ce qui suit à votre objet opts:et votre commande devrait être de retour dans les affaires.
la source
solution dans mon cas
la source
.cmd
, mais échouerait dans un test de plaisanterie dactylographié. - Cette erreur peut être assez difficile à comprendre, cette réponse mérite plus de votes positifs.Si vous rencontrez ce problème avec une application dont vous ne pouvez pas modifier la source, envisagez de l'invoquer avec la variable d'environnement
NODE_DEBUG
définie surchild_process
, par exempleNODE_DEBUG=child_process yarn test
. Cela vous fournira des informations sur les lignes de commande qui ont été invoquées dans quel répertoire et généralement le dernier détail est la raison de l'échec.la source
Bien qu'il puisse s'agir d'un chemin d'environnement ou d'un autre problème pour certaines personnes, je venais d'installer l'extension Latex Workshop pour Visual Studio Code sur Windows 10 et j'ai vu cette erreur lors de la tentative de création / prévisualisation du PDF. L'exécution de VS Code en tant qu'administrateur a résolu le problème pour moi.
la source
J'ai la même erreur pour Windows 8. Le problème est dû au fait qu'une variable d'environnement de votre chemin d'accès système est manquante. Ajoutez la valeur "C: \ Windows \ System32 \" à la variable PATH de votre système.
la source
Ajouter
C:\Windows\System32\
aupath
variable d'environnement.Pas
Accéder à mon ordinateur et à mes propriétés
Cliquez sur Paramètres avancés
Puis sur les variables d'environnement
Sélectionnez
Path
puis cliquez sur modifierCollez les éléments suivants s'ils ne sont pas déjà présents:
C:\Windows\System32\
Fermez l'invite de commande
Exécutez la commande que vous vouliez exécuter
la source