Comment puis-je debug “Erreur: spawn ENOENT” sur node.js?
Quand je reçois 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 résoudre ce problème?
Note de l'auteur: Beaucoup de problèmes avec cette erreur m'a encouragé à poster cette question pour de futures références.
Questions connexes:
- à l'aide de spawn fonction avec NODE_ENV=production
- node.js child_process.spawn d'erreur ENOENT - seulement sous supervisord
- frayer ENOENT node.js erreur
- https://stackoverflow.com/questions/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Node JS - child_process spawn('npm install") dans Grunt les résultats des tâches dans d'erreur ENOENT
- L'exécution de "contremaître" tâche erreur Fatale: spawn ENOENT
- erreur non gérée événement en node js Erreur: spawn ENOENT à errnoException (child_process.js:975:11)
- Node.js SpookyJS: erreur d'exécution hello.js
- https://stackoverflow.com/questions/26572214/run-grunt-on-a-directory-nodewebkit
- Exécutez le fichier exe avec Enfant Processus de NodeJS
- Nœud: child_process.spawn ne fonctionne pas sur l'île de Java, même si c'est dans le chemin d'accès (ENOENT)
- spawn d'erreur ENOENT avec NodeJS (PYTHON liées)
- le redimensionnement d'image n'est pas de travail dans node.js (partial.js) (non-installé dépendance)
- npm install d'erreur ENOENT (build problème de dépendance)
- Ne peut pas installer node.js - module oracle sur Windows 7 (build problème de dépendance)
- Erreur lors de l'installation gulp à l'aide de nodejs sur windows (étrange affaire)
Vous devez vous connecter pour publier un commentaire.
REMARQUE: Cette erreur est presque toujours le fait que la commande n'existe pas, car le répertoire de travail n'existe pas, ou à partir d'un windows uniquement bug.
J'ai trouvé un particulier moyen facile pour se faire une idée de la cause de racine:
Le problème de cette erreur, il y a vraiment peu d'informations dans le message d'erreur pour vous dire où en est le site d'appel est, c'est à dire qui exécutable/commande n'est pas trouvée, surtout quand vous avez une grande base de code où il y a beaucoup de spawn des appels. D'autre part, si nous savons que la commande exacte que la cause de l'erreur alors que nous pouvons suivre @laconbass réponse pour résoudre le problème.
J'ai trouvé un moyen très facile de repérer ce qui commande la cause du problème plutôt que d'ajouter des écouteurs d'événements partout dans votre code comme le suggère @laconbass de réponse. L'idée clé est d'envelopper l'apparition d'origine appel avec un wrapper qui imprime les arguments de l'envoyer à la réapparition d'appel.
Ici est la fonction wrapper, le mettre en haut de la
index.js
ou quel que soit votre démarrage du serveur de script.Alors la prochaine fois que vous exécutez votre application, avant la uncaught exception du message, vous verrez quelque chose comme ça:
De cette façon, vous pouvez facilement savoir qui commande s'est exécutée et ensuite, vous pouvez savoir pourquoi nodejs ne peut pas trouver le fichier exécutable pour résoudre le problème.
spawn()
àexec()
et essayez de nouveau.exec()
vais vous dire ce que la commande essayé exécuter.gulpfile.js
console.log(arguments)
avecconsole.log(JSON.stringify(arguments, null, 4))
en cas de imbriquée (non circulaire) les objets que vous souhaitez imprimerÉtape 1: s'Assurer
spawn
est appelé le droit cheminDe passer en revue l' docs pour child_process.spawn( commande, args, options ):
Vous assurer que vous ne sont pas de mettre des arguments de ligne de commande dans
command
et l'ensemble de laspawn
appel est valide. Passez à l'étape suivante.Étape 2: Identifier les Cas de l'Émetteur qui émet l'événement d'erreur
De recherche sur votre code source pour chaque appel à
spawn
, ouchild_process.spawn
, c'est à direet fixez-t-il un écouteur d'événement pour l' "erreur" de l'événement, afin de vous faire remarquer la exacte de l'Événement de l'Émetteur qui est en train de lancer en tant que 'Non'. Après le débogage, ce gestionnaire peut être retiré.
Exécuter et vous devriez obtenir le chemin d'accès au fichier et le numéro de ligne où votre "erreur" auditeur a été enregistré. Quelque chose comme:
Si les deux premières lignes sont toujours
faire cette étape à nouveau jusqu'à ce qu'ils ne le sont pas. Vous devez identifier l'auditeur qui émet l'erreur avant de passer à la prochaine étape.
Étape 3: s'Assurer que la variable d'environnement
$PATH
est définieIl y a deux scénarios possibles:
spawn
comportement, de sorte que l'enfant environnement du processus sera le même queprocess.env
.env
objet despawn
sur leoptions
argument.Dans les deux scénarios, vous devez inspecter la
PATH
clés sur l'environnement de l'objet qui l'a engendré processus enfant d'utilisation.Exemple pour le scénario 1
Exemple pour le scénario 2
L'absence de
PATH
(c'est à dire, c'estundefined
) sera la cause despawn
à émettre de laENOENT
erreur, car il ne sera pas possible de localiser tous lescommand
sauf si c'est un chemin absolu vers le fichier exécutable.Quand
PATH
est défini correctement, passez à l'étape suivante. Il doit être un répertoire ou une liste de répertoires. Dernier cas, c'est l'habituel.Étape 4: Assurer
command
existe sur un répertoire de celles définies dans lesPATH
Frayer peut émettre l'
ENOENT
d'erreur si le nom de fichiercommand
(j'.e, 'commande') n'existe pas dans au moins l'un des répertoires définis surPATH
.Localiser l'endroit exact de
command
. Sur la plupart des distributions linux, ce qui peut être fait à partir d'un terminal avec lawhich
de commande. Il vous indique le chemin absolu vers le fichier exécutable (comme ci-dessus), ou de savoir si il ne l'est pas.Exemple d'utilisation et de sa sortie lorsqu'une commande est trouvé
Exemple d'utilisation et de sa sortie lorsqu'une commande est pas trouvé
manquer programmes installés sont la cause la plus commune pour un pas trouvé commande. Reportez-vous à chaque commande de la documentation si nécessaire et de les installer.
Lorsque la commande est un simple fichier de script de s'assurer qu'il est accessible à partir d'un répertoire sur le
PATH
. Si elle ne l'est pas, soit le déplacer vers un ou faire un lien vers elle.Une fois que vous déterminer
PATH
est correctement configuré etcommand
est accessible à partir de cela, vous devriez être en mesure de lancer votre processus enfant sansspawn ENOENT
être jeté.PATH
était pas défini. Savez-vous quelles sont les causes? J'ai posé une question à ce sujet ainsi stackoverflow.com/questions/29652582/...undefined
parce que la façon dont j'ai été le frai le nœud proccess.cwd
dans les options, mais le répertoire n'existe pas.spawn('some-command', ['--help'], { env: env });
comme en témoigne l'Étape 3 de cette réponse et passez un environnement personnalisé, assurez-vous de spécifier lePATH
, par exemple:{ env: { PATH: process.env.PATH } }
. L'env option n'hériteront pas des variables à partir de votre actuelle env par défaut.PATH
variable d'environnement n'était pas le même. L'étape 3 est l'étape qui l'a signalé à moi. Merci!shell: true
pour le spawn des options.Comme @DanielImfeld de le signaler, ENOENT sera levée si vous spécifiez "cwd" dans les options, mais le répertoire n'existe pas.
cwd
chemin:: 'c:/... "et pas juste"/...'Windows solution: Remplacer
spawn
avec nœud-croix-de spawn. Par exemple comme ceci au début de votre app.js:var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
@laconbass la réponse m'a aidé et elle est probablement plus correct.
Je suis venu ici parce que j'ai été en utilisant spawn de manière incorrecte.
Un exemple simple:
c'est faux:
c'est faux:
c'est correct:
cependant, je vous recommande de le faire de cette façon:
c'est parce que la
cp.on('exit', fn)
événement aura toujours le feu, tant que bash est installé, sinon, lecp.on('error', fn)
événement peut déclencher en premier lieu, si nous l'utilisons la première manière, si nous le lancement de la " npm " directement.child_process.exec
ou passershell: true
àspawn
.Pour ENOENT sur Windows, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 le fixer.
par exemple le remplacement de spawn('npm', ['v'], {stdio: 'inherit'}) avec:
pour tous node.js version:
pour node.js 5.x et plus tard:
shell: true
Pour toute personne qui pourrait tomber sur ce, si toutes les autres réponses ne sont pas utiles et que vous êtes sous Windows, sachez qu'il est actuellement un gros problème avec
spawn
sur Windows et laPATHEXT
variable d'environnement qui peuvent causer certains appels à lancer pour ne pas fonctionner en fonction de la façon dont l'objectif de commande est installé.spawn
et juste utiliséexec
à la place.Dans mon cas, j'ai été faire cette erreur renvoyé en raison de la nécessaire dépendante de ressources système n'est pas installé.
Plus précisément, j'ai une application NodeJS qui utilise ImageMagick. Malgré le mnp paquet installé, le noyau Linux ImageMagick n'a pas été installé. J'ai fait un apt-get pour installer ImageMagick et après que tout a très bien fonctionné!
J'ai rencontré le même problème, mais j'ai trouvé un moyen simple de le résoudre.
Il semble être
spawn()
erreurs si le programme a été ajouté au CHEMIN d'accès par l'utilisateur (par exemple normal du système des commandes de travail).Pour résoudre ce problème, vous pouvez utiliser le qui module (
npm install --save which
):Assurer module à exécuter est installé ou chemin d'accès complet à la commande si ce n'est pas un nœud module
Utilisation
require('child_process').exec
au lieu de reproduire pour un message d'erreur plus spécifique!par exemple:
J'ai été également passer par ce problème gênant lors de l'exécution de mon cas de test, j'ai donc essayé de nombreuses façons d'obtenir à travers elle. Mais la façon dont fonctionne pour moi est de exécuter votre lanceur de test à partir du répertoire qui contient votre fichier principal qui comprend votre nodejs frayer la fonction de quelque chose comme ceci:
Par exemple, ce nom de fichier est test.js, il suffit donc de déplacer vers le dossier qui contient. Dans mon cas, c'est le dossier de test comme ceci:
puis, à partir de exécuter votre test runner dans mon cas, ses moka de sorte qu'il sera comme ceci:
Que j'ai perdu mon plus qu'un jour pour le comprendre. Profitez-en!!
J'ai été faire cette erreur lorsque vous essayez de déboguer un node.js programme à partir de l'intérieur de VS éditeur de Code sur un système Linux Debian. J'ai remarqué la même chose OK travaillé sur Windows. Les solutions déjà données ici n'ont pas beaucoup d'aide car je n'avais pas écrit de "spawn" des commandes. Le code malveillant a été probablement écrite par Microsoft et caché sous le capot de la VS Code de programme.
Ensuite, j'ai remarqué que node.js est appelé nœud sur Windows mais sur Debian (et sans doute sur les systèmes basés sur Debian comme Ubuntu), il est appelé nodejs. J'ai donc créé un alias à partir d'un terminal en root, j'ai couru
ln -s /usr/bin/nodejs /usr/local/bin/node
et cela a résolu le problème. De la même ou d'une procédure similaire sera vraisemblablement travailler dans d'autres cas où votre node.js est appelé nodejs, mais vous êtes en cours d'exécution d'un programme qui prévoit qu'il sera appelé nœud, ou vice-versa.
J'ai eu le même message d'erreur de windows 8.Le problème est dû à une variable d'environnement de votre chemin d'accès au système est manquant . Ajouter "C:\Windows\System32\" la valeur de votre variable système PATH.
Si vous êtes sur Windows Node.js fait un peu drôle d'affaires lors de la manipulation des citations qui peut vous délivrer une commande qui fonctionne à partir de la console, mais pas lorsqu'il est exécuté dans le Nœud. Par exemple les éléments suivants devrait travail:
mais échoue. Il y a une fantastique option non documentée
windowsVerbatimArguments
pour la manipulation de devis/similaire qui semble faire l'affaire, juste être sûr d'ajouter les éléments suivants à votre opte objet:et votre commande doit être de retour dans les affaires.
solution dans mon cas
.cmd
, mais ne parviennent pas à un tapuscrit plaisanterie de test. -- Cette erreur peut être assez difficile à comprendre, cette réponse mérite plus upvotes.J'ai rencontré ce problème sur Windows, où l'appelant
exec
etspawn
avec la même commande (sans arguments) a bien fonctionné pourexec
(donc je savais que ma commande était sur$PATH
), maisspawn
donnerait ENOENT. S'est avéré que j'avais juste besoin d'ajouter.exe
à la commande j'ai été en utilisant:Changer le
env
option?Ensuite, regardez cette réponse.
J'étais en train de frayer un nœud de processus et TIL que vous devez répartir les variables d'environnement existant lorsque vous frayer sinon vous perdrez la
PATH
variable d'environnement et, éventuellement, d'autres plus importants.C'était le correctif pour moi:
Dans le cas où vous êtes confronté à ce problème avec une application dont la source vous ne pouvez pas modifier songer à invoquer avec la variable d'environnement
NODE_DEBUG
ensemble dechild_process
, par exempleNODE_DEBUG=child_process yarn test
. Cela va vous fournir des informations susceptibles de lignes de commande ont été invoquées dans le répertoire et le plus souvent le dernier détail est la raison de l'échec.Ajouter
C:\Windows\System32\
à lapath
variable d'environnement.Étapes
Aller à mon ordinateur et les propriétés
Cliquez sur paramètres Avancés
Puis sur variables d'Environnement
Sélectionnez
Path
et puis cliquez sur modifierCollez le si n'est pas déjà présent:
C:\Windows\System32\
Fermer l'invite de commande
Exécutez la commande que vous voulez exécuter