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) :
Startet einen neuen Prozess mit den angegebenen commandBefehlszeilenargumenten args. Wenn nicht angegeben, wird argsstandardmäßig ein leeres Array verwendet.
Das dritte Argument wird verwendet, um zusätzliche Optionen anzugeben. Der Standardwert lautet:
{ cwd: undefined, env: process.env }
Verwenden Sie envdiese Option, um Umgebungsvariablen anzugeben, die für den neuen Prozess sichtbar sind. Die Standardeinstellung ist process.env.
Stellen Sie sicher, dass Sie keine Befehlszeilenargumente eingeben commandund der gesamte spawnAufruf 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, oder child_process.spawn, das heißt
spawn('some-command', [ '--help' ]);
und 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.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Wenn Sie ausführen, sollten Sie den Dateipfad und die Zeilennummer erhalten, in der Ihr 'Fehler'-Listener registriert wurde. Etwas wie:
/file/that/registers/the/error/listener.js:29
throw err;
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
Wenn die ersten beiden Zeilen noch sind
events.js:72
throw er; // Unhandled 'error' event
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 $PATHist
Es gibt zwei mögliche Szenarien:
- Sie verlassen sich auf das Standardverhalten
spawn, sodass die untergeordnete Prozessumgebung dieselbe ist wie process.env.
- Sie geben explizit ein
envObjekt spawnan das optionsArgument weiter.
In beiden Szenarien müssen Sie den PATHSchlüssel für das Umgebungsobjekt überprüfen, das der erzeugte untergeordnete Prozess verwendet.
Beispiel für Szenario 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Beispiel für Szenario 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
Das Fehlen von PATH(dh es ist undefined) führt dazu spawn, dass der ENOENTFehler ausgegeben wird , da es nicht möglich ist, einen zu finden, es commandsei denn, es handelt sich um einen absoluten Pfad zur ausführbaren Datei.
Wenn PATHes 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 ENOENTFehler ausgeben , wenn der Dateiname command(dh 'some-command') in mindestens einem der definierten Verzeichnisse nicht vorhanden ist PATH.
Suchen Sie den genauen Ort von command. Bei den meisten Linux-Distributionen kann dies mit dem whichBefehl 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
> which some-command
some-command is /usr/bin/some-command
Beispiel für die Verwendung und deren Ausgabe, wenn ein Befehl nicht gefunden wird
> which some-command
bash: type: some-command: not found
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 PATHes richtig eingestellt commandist und von dort aus darauf zugegriffen werden kann, sollten Sie in der Lage sein, Ihren untergeordneten Prozess zu erzeugen, ohne spawn ENOENTgeworfen zu werden.
execanstatt 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" ] ).