Wenn ich folgenden Fehler erhalte:
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)
Wie kann ich vorgehen, um das Problem zu beheben?
Anmerkung des Autors : Viele Probleme mit diesem Fehler haben mich dazu ermutigt, diese Frage für zukünftige Referenzen zu posten.
Verwandte Fragen:
- Verwenden der Spawn-Funktion mit NODE_ENV = Produktion
- node.js child_process.spawn ENOENT-Fehler - nur unter Aufsicht
- Spawn ENOENT node.js Fehler
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Der Knoten JS - child_process spawn ('npm install') in der Grunt-Task führt zu einem ENOENT-Fehler
- Ausführen der Aufgabe "Vorarbeiter" Schwerwiegender Fehler: Spawn ENOENT
- nicht behandeltes Fehlerereignis im Knoten js Fehler: ENOENT bei errnoException erzeugen (child_process.js: 975: 11)
- Node.js SpookyJS: Fehler beim Ausführen von hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Führen Sie die exe-Datei mit Child Process NodeJS aus
- Knoten: child_process.spawn funktioniert unter Java nicht, obwohl es sich im Pfad befindet (ENOENT)
- ENOENT-Fehler mit NodeJS erzeugen (PYTHON-bezogen)
- Die Größenänderung von Bildern funktioniert in node.js (teilweise.js) nicht (nicht installierte Abhängigkeit)
- npm Installationsfehler ENOENT (Build-Abhängigkeitsproblem)
- Node.js - Oracle-Modul kann unter Windows 7 nicht installiert werden (Build-Abhängigkeitsproblem)
- Fehler beim Installieren von gulp mit nodejs unter Windows (seltsamer Fall)
node.js
debugging
error-handling
child-process
spawn
Laconbass
quelle
quelle
exec
anstatt den Befehl als erstes Argument und die Optionen als Array für das zweite Argument zu übergeben. zB habe ichspawn( "adb logcat -c" )
statt gemachtspawn( "adb", [ "logcat", "-c" ] )
.Antworten:
HINWEIS: Dieser Fehler wird fast immer verursacht, weil der Befehl nicht vorhanden ist, weil das Arbeitsverzeichnis nicht vorhanden ist oder weil nur Windows angezeigt wird.
Ich habe einen besonders einfachen Weg gefunden, um die Ursache zu finden:
Das Problem dieses Fehlers ist, dass die Fehlermeldung nur sehr wenige Informationen enthält, die Ihnen mitteilen, wo sich die Aufrufsite befindet, dh welche ausführbare Datei / welcher Befehl nicht gefunden wird, insbesondere wenn Sie eine große Codebasis haben, in der viele Spawn-Aufrufe vorhanden sind . Wenn wir andererseits den genauen Befehl kennen, der den Fehler verursacht, können wir der Antwort von @laconbass folgen , um das Problem zu beheben.
Ich habe einen sehr einfachen Weg gefunden, um herauszufinden, welcher Befehl das Problem verursacht, anstatt überall in Ihrem Code Ereignis-Listener hinzuzufügen, wie in der Antwort von @laconbass vorgeschlagen. Die Schlüsselidee besteht darin, den ursprünglichen Spawn-Aufruf mit einem Wrapper zu versehen, der die an den Spawn-Aufruf gesendeten Argumente druckt.
Hier ist die Wrapper-Funktion. Platzieren Sie sie oben im
index.js
Startskript Ihres Servers oder in einem anderen Format.Wenn Sie Ihre Anwendung das nächste Mal ausführen, wird vor der Meldung der nicht erfassten Ausnahme Folgendes angezeigt:
Auf diese Weise können Sie leicht erkennen, welcher Befehl tatsächlich ausgeführt wird, und dann herausfinden, warum nodejs die ausführbare Datei zur Behebung des Problems nicht finden kann.
quelle
spawn()
zuexec()
und versuchen Sie es erneut.exec()
wird Ihnen sagen, welchen Befehl es versucht hat auszuführen.Schritt 1: Stellen Sie sicher
spawn
, dass der richtige Weg aufgerufen wirdÜberprüfen Sie zunächst die Dokumente für child_process.spawn (Befehl, Argumente, Optionen) :
Stellen Sie sicher, dass Sie keine Befehlszeilenargumente eingeben
command
und der gesamtespawn
Aufruf gültig ist . Fahren Sie mit dem nächsten Schritt fort.Schritt 2: Identifizieren Sie den Event Emitter, der das Fehlerereignis ausgibt
Suchen Sie auf Ihrem Quellcode für jeden Anruf an
spawn
, oderchild_process.spawn
, das heißtund fügen Sie dort einen Ereignis-Listener für das 'Fehler'-Ereignis hinzu, damit Sie den genauen Ereignis-Emitter bemerken, der es als' Nicht behandelt 'auslöst. Nach dem Debuggen kann dieser Handler entfernt werden.
Wenn Sie ausführen, sollten Sie den Dateipfad und die Zeilennummer erhalten, in der Ihr 'Fehler'-Listener registriert wurde. Etwas wie:
Wenn die ersten beiden Zeilen noch sind
Führen Sie diesen Schritt erneut aus, bis dies nicht mehr der Fall ist. Sie müssen den Listener identifizieren, der den Fehler ausgibt, bevor Sie mit dem nächsten Schritt fortfahren.
Schritt 3: Stellen Sie sicher, dass die Umgebungsvariable festgelegt
$PATH
istEs gibt zwei mögliche Szenarien:
spawn
, sodass die untergeordnete Prozessumgebung dieselbe ist wieprocess.env
.env
Objektspawn
an dasoptions
Argument weiter.In beiden Szenarien müssen Sie den
PATH
Schlüssel für das Umgebungsobjekt überprüfen, das der erzeugte untergeordnete Prozess verwendet.Beispiel für Szenario 1
Beispiel für Szenario 2
Das Fehlen von
PATH
(dh es istundefined
) führt dazuspawn
, dass derENOENT
Fehler ausgegeben wird , da es nicht möglich ist, einen zu finden, escommand
sei denn, es handelt sich um einen absoluten Pfad zur ausführbaren Datei.Wenn
PATH
es richtig eingestellt ist, fahren Sie mit dem nächsten Schritt fort. Es sollte ein Verzeichnis oder eine Liste von Verzeichnissen sein. Letzter Fall ist der übliche.Schritt 4: Stellen Sie sicher
command
, dass in einem Verzeichnis der in definierten Verzeichnisse vorhanden istPATH
Spawn kann den
ENOENT
Fehler ausgeben , wenn der Dateinamecommand
(dh 'some-command') in mindestens einem der definierten Verzeichnisse nicht vorhanden istPATH
.Suchen Sie den genauen Ort von
command
. Bei den meisten Linux-Distributionen kann dies mit demwhich
Befehl von einem Terminal aus erfolgen . Hier erfahren Sie den absoluten Pfad zur ausführbaren Datei (wie oben) oder ob sie nicht gefunden wurde.Beispiel für die Verwendung und deren Ausgabe, wenn ein Befehl gefunden wird
Beispiel für die Verwendung und deren Ausgabe, wenn ein Befehl nicht gefunden wird
Fehlinstallierte Programme sind die häufigste Ursache für einen nicht gefundenen Befehl. Lesen Sie bei Bedarf die einzelnen Befehlsdokumentationen und installieren Sie sie.
Wenn der Befehl eine einfache Skriptdatei ist, stellen Sie sicher, dass Sie über ein Verzeichnis auf der Website darauf zugreifen können
PATH
. Wenn dies nicht der Fall ist, verschieben Sie es entweder auf eins oder erstellen Sie einen Link dazu.Sobald Sie festgestellt haben, dass
PATH
es richtig eingestelltcommand
ist und von dort aus darauf zugegriffen werden kann, sollten Sie in der Lage sein, Ihren untergeordneten Prozess zu erzeugen, ohnespawn ENOENT
geworfen zu werden.quelle
cwd
in den Optionen angeben , aber das angegebene Verzeichnis existiert nicht.spawn('some-command', ['--help'], { env: env });
wie für Schritt 3 in dieser Antwort beispielhaft und eine benutzerdefinierte Umgebung sind vorbei, sicher sein , die angebenPATH
, zum Beispiel:{ env: { PATH: process.env.PATH } }
. Die env-Option erbt standardmäßig keine Variablen von Ihrer aktuellen env.shell: true
zu den Spawn-Optionen überging.Wie @DanielImfeld darauf hingewiesen hat , wird ENOENT ausgelöst, wenn Sie in den Optionen "cwd" angeben, das angegebene Verzeichnis jedoch nicht vorhanden ist.
quelle
cwd
PfadWindows - Lösung: Ersetzen Sie
spawn
mit Knoten-Quer Laich . Zum Beispiel so am Anfang Ihrer app.js:quelle
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
@ laconbass Antwort hat mir geholfen und ist wahrscheinlich am richtigsten.
Ich bin hierher gekommen, weil ich Spawn falsch verwendet habe. Als einfaches Beispiel:
Das ist falsch:
Das ist falsch:
das ist richtig:
Ich empfehle es jedoch folgendermaßen:
Dies liegt daran, dass das
cp.on('exit', fn)
Ereignis dann immer ausgelöst wird, solange bash installiert ist. Andernfalls wird dascp.on('error', fn)
Ereignis möglicherweise zuerst ausgelöst, wenn wir es auf die erste Weise verwenden und 'npm' direkt starten.quelle
child_process.exec
oder anshell: true
sie übergebenspawn
.Für ENOENT unter Windows kann https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 das Problem beheben.
zB Spawn ersetzen ('npm', ['-v'], {stdio: 'erben'}) durch:
für alle node.js version:
für node.js 5.x und höher:
quelle
shell: true
Wenn alle anderen Antworten nicht hilfreich sind und Sie unter Windows arbeiten, sollten Sie wissen, dass derzeit ein großes Problem mit
spawn
Windows und derPATHEXT
Umgebungsvariablen vorliegt, das dazu führen kann, dass bestimmte Aufrufe je nach Art nicht funktionieren Der Zielbefehl ist installiert.quelle
spawn
und benutzteexec
stattdessen nur.In meinem Fall wurde dieser Fehler ausgelöst, weil die erforderlichen abhängigen Systemressourcen nicht installiert wurden.
Insbesondere habe ich eine NodeJS-App, die ImageMagick verwendet. Trotz der Installation des npm-Pakets wurde der Linux-Kern-ImageMagick nicht installiert. Ich habe ImageMagick installiert und danach hat alles super funktioniert!
quelle
in Windows einfach hinzufügen
shell: true
Option mein Problem:falsch:
richtig:
quelle
Ändern Sie die
env
Option?Dann schauen Sie sich diese Antwort an.
Ich habe versucht, einen Knotenprozess zu erzeugen und TIL, dass Sie die vorhandenen Umgebungsvariablen verbreiten sollten, wenn Sie erzeugen, sonst verlieren Sie die
PATH
Umgebungsvariable und möglicherweise andere wichtige.Dies war die Lösung für mich:
quelle
Bevor jemand zu viel Zeit mit dem Debuggen dieses Problems verbringt, kann es meistens durch Löschen
node_modules
und erneutes Installieren der Pakete behoben werden.Installieren:
Wenn eine Sperrdatei vorhanden ist, können Sie diese verwenden
oder
respektvoll. wenn nicht, dann
oder
quelle
Ich bin auf dasselbe Problem gestoßen, habe aber einen einfachen Weg gefunden, es zu beheben. Es scheint zu sein
spawn()
Fehler , wenn das Programm vom Benutzer zum PATH hinzugefügt wurde (z. B. funktionieren normale Systembefehle).Um dies zu beheben, können Sie das welche Modul (
npm install --save which
) verwenden:quelle
Verwenden Sie
require('child_process').exec
anstelle von Spawn für eine spezifischere Fehlermeldung!zum Beispiel:
quelle
Stellen Sie sicher, dass das auszuführende Modul installiert ist oder dass der vollständige Pfad zum Befehl vorhanden ist, wenn es sich nicht um ein Knotenmodul handelt
quelle
Ich habe dieses nervige Problem auch beim Ausführen meiner Testfälle durchlaufen, also habe ich viele Möglichkeiten ausprobiert, um es zu vermitteln. Für mich funktioniert es jedoch so, dass Sie Ihren Testläufer aus dem Verzeichnis ausführen, das Ihre Hauptdatei enthält, die die Spawn- Funktion Ihres Knotens enthält.
Dieser Dateiname lautet beispielsweise test.js. Wechseln Sie einfach in den Ordner, in dem er enthalten ist . In meinem Fall ist es ein Testordner wie folgt:
dann von deinem Testläufer in meinem Fall seinen Mokka laufen lassen, so wird es so sein:
Ich habe mehr als einen Tag damit verbracht, es herauszufinden. Genießen!!
quelle
Ich bin unter Windows auf dieses Problem gestoßen, bei dem das Aufrufen
exec
undspawn
mit genau demselben Befehl (ohne Argumente) gut funktioniert hatexec
(also wusste ich, dass mein Befehl aktiviert war$PATH
), aberspawn
ENOENT geben würde. Es stellte sich heraus, dass ich nur.exe
an den Befehl anhängen musste , den ich verwendete:quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, ein node.js-Programm im VS Code-Editor auf einem Debian Linux-System zu debuggen. Mir ist aufgefallen, dass das Gleiche unter Windows funktioniert hat. Die hier angegebenen Lösungen waren keine große Hilfe, da ich keine "Spawn" -Befehle geschrieben hatte. Der fehlerhafte Code wurde vermutlich von Microsoft geschrieben und unter der Haube des VS Code-Programms versteckt.
Als nächstes bemerkte ich, dass node.js unter Windows Node heißt, aber unter Debian (und vermutlich auf Debian-basierten Systemen wie Ubuntu) Nodejs. Also habe ich einen Alias erstellt - von einem Root-Terminal aus bin ich gelaufen
ln -s / usr / bin / nodejs / usr / local / bin / node
und das löste das Problem. Das gleiche oder ein ähnliches Verfahren funktioniert vermutlich in anderen Fällen, in denen Ihre node.js als nodejs bezeichnet wird, Sie jedoch ein Programm ausführen, das erwartet, dass es als node bezeichnet wird, oder umgekehrt.
quelle
Wenn Sie unter Windows Node.js arbeiten, werden beim Umgang mit Anführungszeichen einige lustige Geschäfte gemacht, die dazu führen können, dass Sie einen Befehl ausgeben, von dem Sie wissen, dass er über die Konsole funktioniert, jedoch nicht, wenn er in Node ausgeführt wird. Zum Beispiel sollte Folgendes funktionieren:
scheitert aber. Es gibt eine fantastisch undokumentierte Option
windowsVerbatimArguments
für den Umgang mit Anführungszeichen / Ähnlichem, die den Trick zu tun scheint. Fügen Sie Ihrem opts-Objekt jedoch Folgendes hinzu:und Ihr Befehl sollte wieder im Geschäft sein.
quelle
Lösung in meinem Fall
quelle
.cmd
, aber in einem Typoskript- Scherztest fehlschlagen. - Dieser Fehler kann ziemlich schwer herauszufinden sein, diese Antworten verdienen mehr positive Stimmen.Falls Sie sich erleben Sie dieses Problem mit einer Anwendung , deren Quelle man bedenkt , nicht ändern kann sie mit dem Umgebungsvariablen Aufruf
NODE_DEBUG
Satzchild_process
, zum BeispielNODE_DEBUG=child_process yarn test
. Auf diese Weise erhalten Sie Informationen darüber, welche Befehlszeilen in welchem Verzeichnis aufgerufen wurden, und normalerweise ist das letzte Detail der Grund für den Fehler.quelle
Obwohl dies für einige Benutzer ein Umgebungspfad oder ein anderes Problem sein kann, habe ich gerade die Latex Workshop-Erweiterung für Visual Studio Code unter Windows 10 installiert und diesen Fehler beim Versuch, die PDF-Datei zu erstellen / in der Vorschau anzuzeigen, festgestellt. Das Ausführen von VS Code als Administrator hat das Problem für mich gelöst.
quelle
Ich habe den gleichen Fehler für Windows 8 erhalten. Das Problem liegt daran, dass eine Umgebungsvariable Ihres Systempfads fehlt. Fügen Sie Ihrer System-PATH-Variablen den Wert "C: \ Windows \ System32 \" hinzu.
quelle
In
C:\Windows\System32\
an diepath
Umgebungsvariable.Schritte
Gehen Sie zu meinem Computer und Eigenschaften
Klicken Sie auf Erweiterte Einstellungen
Dann auf Umgebungsvariablen
Wählen Sie
Path
und klicken Sie dann auf BearbeitenFügen Sie Folgendes ein, falls nicht bereits vorhanden:
C:\Windows\System32\
Schließen Sie die Eingabeaufforderung
Führen Sie den Befehl aus, den Sie ausführen möchten
quelle