Kiedy pojawia się następujący błąd:
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)
Jaką procedurę mogę wykonać, aby to naprawić?
Notka autora : Wiele problemów z tym błędem zachęciło mnie do opublikowania tego pytania do przyszłych odniesień.
Powiązane pytania:
- za pomocą funkcji spawn z NODE_ENV = produkcja
- node.js child_process.spawn Błąd ENOENT - tylko pod nadzorem
- spawn ENOENT błąd node.js
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Węzeł JS - spawnproces child_process ('instalacja npm') w zadaniu Grunt powoduje błąd ENOENT
- Uruchamianie zadania „majster” Błąd krytyczny: spawn ENOENT
- nieobsługiwane zdarzenie błędu w węźle js Błąd: spawn ENOENT w errnoException (child_process.js: 975: 11)
- Node.js SpookyJS: błąd podczas wykonywania hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Uruchom plik exe za pomocą Child Process NodeJS
- Węzeł: child_process.spawn nie działa na Javie, nawet jeśli jest na ścieżce (ENOENT)
- spawn ENOENT błąd z NodeJS (związany z PYTHON)
- zmiana rozmiaru obrazu nie działa w node.js (stron.js) (zależność niezainstalowana)
- błąd instalacji npm ENOENT (problem zależności kompilacji)
- Nie można zainstalować node.js - moduł Oracle w systemie Windows 7 (problem zależności kompilacji)
- Błąd instalowania gulpa przy użyciu nodejs w systemie Windows (dziwny przypadek)
node.js
debugging
error-handling
child-process
spawn
laconbass
źródło
źródło
exec
zamiast przekazać polecenie jako pierwszy argument, a opcje jako tablicę dla drugiego argumentu. np. robiłemspawn( "adb logcat -c" )
zamiastspawn( "adb", [ "logcat", "-c" ] )
.Odpowiedzi:
UWAGA: Ten błąd jest prawie zawsze powodowany, ponieważ polecenie nie istnieje, ponieważ katalog roboczy nie istnieje lub z powodu błędu tylko w systemie Windows.
Znalazłem szczególnie łatwy sposób, aby uzyskać pojęcie o podstawowej przyczynie:
Problem polega na tym, że w komunikacie o błędzie jest naprawdę niewiele informacji, które wskazują, gdzie znajduje się strona wywoływania, tzn. Który plik wykonywalny / polecenie nie został znaleziony, zwłaszcza gdy masz dużą bazę kodu, w której jest wiele wywołań spawn . Z drugiej strony, jeśli znamy dokładne polecenie, które powoduje błąd, możemy postępować zgodnie z odpowiedzią @laconbass, aby rozwiązać problem.
Znalazłem bardzo łatwy sposób na wykrycie, które polecenie powoduje problem, zamiast dodawania detektorów zdarzeń w całym kodzie, jak sugeruje odpowiedź @laconbass. Kluczową ideą jest zawinięcie pierwotnego wywołania spawn za pomocą opakowania, które wypisuje argumenty wysłane do wywołania spawn.
Oto funkcja otoki, umieść ją na górze
index.js
skryptu startowego serwera lub cokolwiek innego.Następnie przy następnym uruchomieniu aplikacji, przed komunikatem o nieprzechwyconym wyjątku, zobaczysz coś takiego:
W ten sposób możesz łatwo wiedzieć, które polecenie jest faktycznie wykonywane, a następnie dowiedzieć się, dlaczego nodejs nie może znaleźć pliku wykonywalnego, aby rozwiązać problem.
źródło
spawn()
sięexec()
i spróbuj ponownie.exec()
powie ci, jakie polecenie próbował uruchomić.Krok 1: Upewnij
spawn
się, że nazywa się właściwą drogęNajpierw przejrzyj dokumentację child_process.spawn (polecenie, argumenty, opcje) :
Upewnij się, że nie wstawiasz żadnych argumentów wiersza poleceń,
command
a całespawn
wywoł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
spawn
lubchild_process.spawn
, tji 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ąć.
Wykonaj, a powinieneś uzyskać ścieżkę do pliku i numer wiersza, w którym zarejestrowany został Twój detektor błędu. Coś jak:
Jeśli pierwsze dwie linie są nadal
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
$PATH
jest ustawionaIstnieją dwa możliwe scenariusze:
spawn
zachowaniu, więc środowisko procesów potomnych będzie takie samo jakprocess.env
.env
obiektu dospawn
naoptions
argument.W obu scenariuszach należy sprawdzić
PATH
klucz obiektu środowiskowego, którego będzie używał odrodzony proces potomny.Przykład dla scenariusza 1
Przykład dla scenariusza 2
Brak
PATH
(tj. Jestundefined
) spowodujespawn
wyświetlenieENOENT
błędu , ponieważ nie będzie można go zlokalizować,command
chyba że będzie to bezwzględna ścieżka do pliku wykonywalnego.Po
PATH
prawidł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
command
istnieje katalog w katalogu zdefiniowanym wPATH
Odrodzenie może wyemitować
ENOENT
błąd, jeśli nazwa plikucommand
(tj. „Jakieś polecenie”) nie istnieje w co najmniej jednym z katalogów zdefiniowanych wPATH
.Znajdź dokładne miejsce
command
. W większości dystrybucji Linuksa można to zrobić z terminala za pomocąwhich
polecenia. 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
Przykład użycia tego i jego wyniku, gdy nie znaleziono polecenia
ź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
PATH
jest poprawnie ustawiony icommand
dostępny z niego, powinieneś być w stanie odrodzić proces potomny bezspawn ENOENT
rzucania.źródło
cwd
w opcjach, ale podany katalog nie istnieje.spawn('some-command', ['--help'], { env: env });
czego przykładem Etapu 3 w tej odpowiedzi i przechodzą środowisko niestandardową, należy określićPATH
, na przykład:{ env: { PATH: process.env.PATH } }
. Opcja env domyślnie nie dziedziczy zmiennych z bieżącej env.shell: true
do opcji odradzania.Jak wskazał @DanielImfeld , ENOENT zostanie wyrzucony, jeśli w opcjach podasz „cwd”, ale podany katalog nie istnieje.
źródło
cwd
ścieżce należy również umieścić literę dysku : „c: / ...”, a nie tylko „/ ...”Rozwiązanie Windows: Wymienić
spawn
z węzła-cross-tarło . Na przykład w ten sposób na początku pliku app.js:źródło
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
Odpowiedź @ laconbass pomogła mi i jest prawdopodobnie najbardziej poprawna.
Przybyłem tutaj, ponieważ nieprawidłowo używałem spawn. Jako prosty przykład:
to jest niepoprawne:
to jest niepoprawne:
to jest poprawne:
jednak polecam zrobić to w ten sposób:
dzieje się tak, ponieważ wtedy
cp.on('exit', fn)
zdarzenie będzie zawsze uruchamiane, dopóki zainstalowana jest bash, w przeciwnymcp.on('error', fn)
razie zdarzenie może zostać uruchomione jako pierwsze, jeśli użyjemy go w pierwszy sposób, jeśli uruchomimy bezpośrednio „npm”.źródło
child_process.exec
lub przekazaćshell: true
dospawn
.W przypadku ENOENT w systemie Windows https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 to napraw.
np. zamień spawn ('npm', ['-v'], {stdio: 'inherit'}) na:
dla wszystkich wersji node.js:
dla node.js 5.x i nowszych:
źródło
shell: true
Dla każdego, kto może się na to natknąć, jeśli wszystkie inne odpowiedzi nie pomogą i jesteś w systemie Windows, wiedz, że istnieje obecnie duży problem z
spawn
systemem Windows iPATHEXT
zmienną środowiskową, który może powodować, że niektóre wywołania nie będą działać w zależności od tego, jak polecenie docelowe jest zainstalowane.źródło
spawn
i po prostu użyłemexec
.W moim przypadku ten błąd został zgłoszony z powodu niezainstalowania niezbędnych zależnych zasobów systemowych.
Mówiąc dokładniej, mam aplikację NodeJS, która wykorzystuje ImageMagick. Pomimo zainstalowanego pakietu npm, podstawowy Linux ImageMagick nie został zainstalowany. Zrobiłem apt-get, aby zainstalować ImageMagick, a potem wszystko działało świetnie!
źródło
w systemie Windows dodanie
shell: true
opcji rozwiązało mój problem:błędny:
poprawny:
źródło
Zmieniasz
env
opcję?Następnie spójrz na tę odpowiedź.
Próbowałem spawnować proces węzła i TIL, że powinieneś rozprzestrzeniać istniejące zmienne środowiskowe, kiedy spawnujesz, inaczej stracisz
PATH
zmienną środowiskową i prawdopodobnie inne ważne.To była poprawka dla mnie:
źródło
Zanim ktokolwiek poświęci dużo czasu na debugowanie tego problemu, przez większość czasu można go rozwiązać, usuwając
node_modules
i ponownie instalując pakiety.Żeby zainstalować:
Jeśli istnieje plik blokujący, możesz użyć
lub
z szacunkiem. Jeśli nie wtedy
lub
źródło
Natrafiłem na ten sam problem, ale znalazłem prosty sposób, aby go naprawić. Wygląda na
spawn()
błędy, jeśli program został dodany do ŚCIEŻKI przez użytkownika (np. Działają normalne polecenia systemowe).Aby to naprawić, możesz użyć modułu which (
npm install --save which
):źródło
Użyj
require('child_process').exec
zamiast spawn, aby uzyskać bardziej szczegółowy komunikat o błędzie!na przykład:
źródło
Upewnij się, że moduł do wykonania jest zainstalowany lub pełna ścieżka do polecenia, jeśli nie jest to moduł węzła
źródło
Miałem również do czynienia z tym irytującym problemem podczas uruchamiania moich testów, więc próbowałem go rozwiązać na wiele sposobów. Ale dla mnie sposób polega na uruchomieniu testera z katalogu, który zawiera twój główny plik, który zawiera twoją funkcję spawnowania nodejsa mniej więcej tak:
Na przykład ta nazwa pliku to test.js , więc po prostu przejdź do folderu, który ją zawiera . W moim przypadku jest to folder testowy taki jak ten:
następnie uruchom swojego testera w moim przypadku jego mokkę, więc będzie to tak:
Zmarnowałem więcej niż jeden dzień, żeby to rozgryźć. Cieszyć się!!
źródło
Natknąłem się na ten problem w systemie Windows, gdzie zadzwonienie
exec
ispawn
przy użyciu tego samego polecenia (pomijając argumenty) działało dobrzeexec
(więc wiedziałem, że moje polecenie jest włączone$PATH
), alespawn
dałoby ENOENT. Okazało się, że muszę tylko dołączyć.exe
do polecenia, którego używałem:źródło
Ten błąd pojawiał się podczas próby debugowania programu node.js z poziomu edytora VS Code w systemie Linux Debian. Zauważyłem, że to samo działa OK w systemie Windows. Rozwiązania podane wcześniej nie były zbyt pomocne, ponieważ nie napisałem żadnych poleceń „spawn”. Obraźliwy kod został prawdopodobnie napisany przez Microsoft i ukryty pod maską programu VS Code.
Następnie zauważyłem, że node.js jest nazywany węzłem w systemie Windows, ale w Debianie (i prawdopodobnie w systemach opartych na Debianie, takich jak Ubuntu) nazywa się nodejs. Więc stworzyłem alias - z terminalu root uruchomiłem
ln -s / usr / bin / nodejs / usr / local / bin / node
i to rozwiązało problem. Ta sama lub podobna procedura będzie prawdopodobnie działać w innych przypadkach, gdy twój node.js jest nazywany nodejs, ale używasz programu, który oczekuje, że będzie się nazywał node, lub odwrotnie.
źródło
Jeśli korzystasz z Windows Node.js, masz zabawny interes z obsługą cytatów, co może skutkować wydaniem polecenia, które działa z konsoli, ale nie działa po uruchomieniu w węźle. Na przykład następujące powinny działać:
ale zawodzi. Istnieje fantastycznie nieudokumentowana opcja
windowsVerbatimArguments
obsługi cytatów / podobnych, która wydaje się załatwić sprawę, po prostu dodaj następujące obiekty do obiektu opts:a twoje polecenie powinno wrócić do pracy.
źródło
rozwiązanie w moim przypadku
źródło
.cmd
, ale nie powiodło się w teście maszynopisu. - Ten błąd może być dość trudny do zrozumienia, odpowiedzi te zasługują na więcej głosów pozytywnych.Jeśli masz ten problem z aplikacją, której źródła nie możesz zmodyfikować, rozważ wywołanie go ze zmienną środowiskową
NODE_DEBUG
ustawionąchild_process
npNODE_DEBUG=child_process yarn test
. Dzięki temu dowiesz się, które wiersze poleceń zostały wywołane w którym katalogu, i zwykle ostatni szczegół jest przyczyną niepowodzenia.źródło
Chociaż może to być ścieżka środowiska lub inny problem dla niektórych osób, właśnie zainstalowałem rozszerzenie Latex Workshop dla programu Visual Studio Code w systemie Windows 10 i zobaczyłem ten błąd podczas próby kompilacji / podglądu pliku PDF. Uruchomienie VS Code jako Administrator rozwiązało problem dla mnie.
źródło
Mam ten sam błąd w systemie Windows 8. Problem jest spowodowany brakiem zmiennej środowiskowej ścieżki systemowej. Dodaj wartość „C: \ Windows \ System32 \” do zmiennej systemowej PATH.
źródło
Dodaj
C:\Windows\System32\
dopath
zmiennej środowiskowej.Kroki
Przejdź do mojego komputera i właściwości
Kliknij Ustawienia zaawansowane
Następnie zmienne środowiskowe
Wybierz,
Path
a następnie kliknij edytujWklej następujące, jeśli jeszcze nie są obecne:
C:\Windows\System32\
Zamknij wiersz polecenia
Uruchom polecenie, które chcesz uruchomić
źródło