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 command
Befehlszeilenargumenten args
. Wenn nicht angegeben, wird args
standardmäß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 env
diese 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 command
und der gesamte spawn
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
, 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 $PATH
ist
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
env
Objekt spawn
an das options
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
// 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 ENOENT
Fehler ausgegeben wird , da es nicht möglich ist, einen zu finden, es command
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 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 which
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
> 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 PATH
es richtig eingestellt command
ist und von dort aus darauf zugegriffen werden kann, sollten Sie in der Lage sein, Ihren untergeordneten Prozess zu erzeugen, ohne spawn ENOENT
geworfen zu werden.
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" ] )
.