Krok 1: Upewnij spawnsię, że nazywa się właściwą drogę
Najpierw przejrzyj dokumentację child_process.spawn (polecenie, argumenty, opcje) :
Uruchamia nowy proces z podanym commandargumentem wiersza poleceń w args. Jeśli zostanie pominięty, argsdomyślnie jest pusta tablica.
Trzeci argument służy do określenia dodatkowych opcji, które domyślnie:
{ cwd: undefined, env: process.env }
Służy envdo określania zmiennych środowiskowych, które będą widoczne dla nowego procesu, domyślnie jest to process.env.
Upewnij się, że nie wstawiasz żadnych argumentów wiersza poleceń, commanda całe spawnwywołanie jest prawidłowe . Przejdź do następnego kroku.
Krok 2: Zidentyfikuj emiter zdarzeń, który emituje zdarzenie błędu
Wyszukaj w kodzie źródłowym każde połączenie do spawnlub child_process.spawn, tj
spawn('some-command', [ '--help' ]);
i dołącz tam detektor zdarzeń dla zdarzenia „błąd”, abyś zauważył dokładny emiter zdarzeń, który wyrzuca go jako „nieobsługiwany”. Po debugowaniu ten program obsługi można usunąć.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Wykonaj, a powinieneś uzyskać ścieżkę do pliku i numer wiersza, w którym zarejestrowany został Twój detektor błędu. Coś jak:
/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)
Jeśli pierwsze dwie linie są nadal
events.js:72
throw er; // Unhandled 'error' event
wykonaj ten krok ponownie, dopóki nie będą. Przed przejściem do następnego kroku musisz zidentyfikować nasłuchującego, który emituje błąd.
Krok 3: Upewnij się, że zmienna środowiskowa $PATHjest ustawiona
Istnieją dwa możliwe scenariusze:
- Polegasz na domyślnym
spawnzachowaniu, więc środowisko procesów potomnych będzie takie samo jak process.env.
- Jesteś explicity przechodzącą
envobiektu do spawnna optionsargument.
W obu scenariuszach należy sprawdzić PATHklucz obiektu środowiskowego, którego będzie używał odrodzony proces potomny.
Przykład dla scenariusza 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Przykład dla scenariusza 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
Brak PATH(tj. Jest undefined) spowoduje spawnwyświetlenie ENOENTbłędu , ponieważ nie będzie można go zlokalizować, commandchyba że będzie to bezwzględna ścieżka do pliku wykonywalnego.
Po PATHprawidłowym ustawieniu przejdź do następnego kroku. Powinien to być katalog lub lista katalogów. Ostatni przypadek jest zwykły.
Krok 4: Upewnij się, że commandistnieje katalog w katalogu zdefiniowanym wPATH
Odrodzenie może wyemitować ENOENTbłąd, jeśli nazwa pliku command(tj. „Jakieś polecenie”) nie istnieje w co najmniej jednym z katalogów zdefiniowanych w PATH.
Znajdź dokładne miejsce command. W większości dystrybucji Linuksa można to zrobić z terminala za pomocą whichpolecenia. Powie ci bezwzględną ścieżkę do pliku wykonywalnego (jak wyżej) lub powie, czy go nie znaleziono.
Przykład użycia tego i jego wyniku po znalezieniu polecenia
> which some-command
some-command is /usr/bin/some-command
Przykład użycia tego i jego wyniku, gdy nie znaleziono polecenia
> which some-command
bash: type: some-command: not found
źle zainstalowane programy są najczęstszą przyczyną nieznalezienia polecenia. W razie potrzeby zapoznaj się z dokumentacją każdego polecenia i zainstaluj ją.
Gdy polecenie jest prostym plikiem skryptu, upewnij się, że jest dostępny z katalogu w PATH. Jeśli nie, przenieś go do jednego lub stwórz link do niego.
Po ustaleniu, że PATHjest poprawnie ustawiony i commanddostępny z niego, powinieneś być w stanie odrodzić proces potomny bez spawn ENOENTrzucania.
execzamiast przekazać polecenie jako pierwszy argument, a opcje jako tablicę dla drugiego argumentu. np. robiłemspawn( "adb logcat -c" )zamiastspawn( "adb", [ "logcat", "-c" ] ).