Когда я получаю следующую ошибку:
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)
Какую процедуру я могу выполнить, чтобы исправить это?
Примечание автора : множество проблем с этой ошибкой побудило меня опубликовать этот вопрос для будущих ссылок.
Смежные вопросы:
- используя функцию порождения с NODE_ENV = production
- node.js child_process.spawn Ошибка ENOENT - только под наблюдением
- spawn ENOENT node.js ошибка
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Узел JS - порождение child_process ('npm install') в задаче Grunt приводит к ошибке ENOENT
- Запуск задачи «бригадир». Неустранимая ошибка: порождает ENOENT.
- необработанное событие ошибки в узле js Ошибка: порождает ENOENT в errnoException (child_process.js: 975: 11)
- Node.js SpookyJS: ошибка при выполнении hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Запустите исполняемый файл с дочерним процессом NodeJS
- Узел: child_process.spawn не работает на Java, даже если он находится в пути (ENOENT)
- ошибка ENOENT порождения с NodeJS (связанный с PYTHON)
- изменение размера изображения не работает в node.js (part.js) ( неустановленная зависимость)
- Ошибка установки npm ENOENT (проблема зависимости сборки)
- Не удается установить node.js - модуль Oracle в Windows 7 (проблема с зависимостью сборки)
- Ошибка установки gulp с помощью nodejs на Windows (странный случай)
node.js
debugging
error-handling
child-process
spawn
laconbass
источник
источник
exec
вместо того, чтобы передавать команду в качестве первого аргумента и параметры в качестве массива для второго аргумента. например, я делалspawn( "adb logcat -c" )
вместоspawn( "adb", [ "logcat", "-c" ] )
.Ответы:
ПРИМЕЧАНИЕ. Эта ошибка почти всегда возникает из-за того, что команда не существует, потому что рабочий каталог не существует или из-за ошибки Windows.
Я нашел очень простой способ понять причину:
Проблема этой ошибки в том, что в сообщении об ошибке действительно мало информации, чтобы сказать вам, где находится сайт вызова, т.е. какой исполняемый файл / команда не найден, особенно если у вас большая кодовая база, где много вызовов вызова , С другой стороны, если мы знаем точную команду, которая вызывает ошибку, тогда мы можем следовать ответу @laconbass, чтобы решить проблему.
Я нашел очень простой способ определить, какая команда вызывает проблему, вместо добавления прослушивателей событий в вашем коде, как предложено в ответе @laconbass. Основная идея заключается в том, чтобы обернуть исходный вызов spawn оболочкой, которая печатает аргументы, отправленные вызову spawn.
Вот функция-обертка, поместите ее в начало
index.js
или любой другой сценарий запуска вашего сервера.Затем в следующий раз, когда вы запустите ваше приложение, перед сообщением с неперехваченным исключением вы увидите что-то вроде этого:
Таким образом, вы можете легко узнать, какая команда на самом деле выполняется, а затем вы можете узнать, почему nodejs не может найти исполняемый файл для решения проблемы.
источник
spawn()
наexec()
и попробуйте снова.exec()
скажет вам, какую команду он пытался запустить.Шаг 1: Убедитесь, что
spawn
это правильный путьСначала просмотрите документы для child_process.spawn (команда, аргументы, параметры) :
Убедитесь, что вы не вводите никаких аргументов командной строки,
command
и весьspawn
вызов действителен . Перейдите к следующему шагу.Шаг 2. Определите источник событий, который генерирует событие ошибки
Поиск по исходному коду для каждого звонка
spawn
илиchild_process.spawn
, т. Е.и прикрепите туда прослушиватель событий для события error, чтобы вы точно заметили Emitter, который выбрасывает его как «Unhandled». После отладки этот обработчик может быть удален.
Выполните, и вы должны получить путь к файлу и номер строки, где был зарегистрирован ваш прослушиватель ошибок. Что-то вроде:
Если первые две строки еще
сделайте этот шаг снова, пока их нет. Вы должны определить слушателя, который выдает ошибку, прежде чем перейти к следующему шагу.
Шаг 3. Убедитесь, что переменная среды
$PATH
установленаЕсть два возможных сценария:
spawn
поведение по умолчанию , поэтому среда дочерних процессов будет такой же, как иprocess.env
.env
объектspawn
вoptions
аргумент.В обоих сценариях вы должны проверить
PATH
ключ объекта среды, который будет использоваться порожденным дочерним процессом.Пример для сценария 1
Пример для сценария 2
Отсутствие
PATH
(т.е. этоundefined
) заставитspawn
излучатьENOENT
ошибку , так как это не будет возможно найти какой - либо ,command
если это не абсолютный путь к исполняемому файлу.Когда
PATH
правильно установлено, переходите к следующему шагу.Это должен быть каталог или список каталогов. Последний случай обычный.Шаг 4: Убедитесь, что
command
существует в каталоге тех, которые определены вPATH
Spawn может выдать
ENOENT
ошибку, если имя файлаcommand
(то есть 'some-command') не существует хотя бы в одном из каталогов, определенных вPATH
.Найдите точное место
command
. В большинстве дистрибутивов Linux это можно сделать из терминала с помощьюwhich
команды. Он скажет вам абсолютный путь к исполняемому файлу (как выше), или скажет, если он не найден.Пример использования которого и его вывод, когда команда найдена
Пример использования которого и его вывод, когда команда не найдена
неправильно установленные программы являются наиболее частой причиной не найденной команды. При необходимости обратитесь к документации по каждой команде и установите ее.
Когда команда представляет собой простой файл сценария, убедитесь, что он доступен из каталога на
PATH
. Если это не так, либо переместите его к одному, либо сделайте ссылку на него.Как только вы определите, что
PATH
он правильно настроен иcommand
доступен из него, вы сможете создавать дочерний процесс, неspawn ENOENT
вызывая его.источник
cwd
в опциях, но данный каталог не существует.spawn('some-command', ['--help'], { env: env });
качестве примера на шаге 3 в этом ответе и проходят пользовательскую среду, обязательно указатьPATH
, например:{ env: { PATH: process.env.PATH } }
. Опция env не будет наследовать переменные от вашего текущего env по умолчанию.shell: true
к опциям появления.Как указал @DanielImfeld , ENOENT будет выброшен, если вы укажете «cwd» в опциях, но данный каталог не существует.
источник
cwd
путь букву диска : «c: / ...», а не просто «/ ...»Решение для Windows: замените
spawn
на узел-перекрестный спавн . Например, вот так в начале вашего app.js:источник
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
Ответ @ laconbass мне помог и, наверное, самый правильный.
Я пришел сюда, потому что я использовал спавн неправильно. В качестве простого примера:
это неверно:
это неверно:
это верно:
Тем не менее, я рекомендую сделать это следующим образом:
это потому, что тогда
cp.on('exit', fn)
событие будет всегдаcp.on('error', fn)
запускаться, пока установлена bash, в противном случае событие может запускаться первым, если мы используем его первым способом, если мы запускаем 'npm' напрямую.источник
child_process.exec
или перейтиshell: true
кspawn
.Для ENOENT в Windows https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 это исправить.
например, заменить spawn ('npm', ['-v'], {stdio: 'наследовать'}) на:
для всей версии node.js:
для node.js 5.x и выше:
источник
shell: true
Для тех, кто может наткнуться на это, если все остальные ответы не помогают, и вы находитесь в Windows, знайте, что в настоящее время существует большая проблема с
spawn
Windows иPATHEXT
переменная окружения, которая может привести к тому, что определенные вызовы не будут работать, в зависимости от того, как целевая команда установлена.источник
spawn
и просто использовалexec
вместо этого.В моем случае я получал эту ошибку из-за того, что не были установлены необходимые зависимые системные ресурсы.
В частности, у меня есть приложение NodeJS, которое использует ImageMagick. Несмотря на установленный пакет npm, ядро Linux ImageMagick не было установлено. Я сделал apt-get для установки ImageMagick, и после этого все работало отлично!
источник
в Windows, просто добавив
shell: true
опцию, решил мою проблему:неправильно:
верный:
источник
Вы меняете
env
опцию?Тогда посмотрите на этот ответ.
Я пытался порождать процесс узла и TIL, чтобы вы распространяли существующие переменные окружения, когда вы порождаете, иначе вы потеряете
PATH
переменную окружения и, возможно, другие важные.Это было исправление для меня:
источник
Прежде чем кто-либо потратит много времени на отладку этой проблемы, большую часть времени она может быть решена путем удаления
node_modules
и переустановки пакетов.Установить:
Если существует файл блокировки, вы можете использовать
или
respectivly. если нет то
или
источник
Я столкнулся с той же проблемой, но нашел простой способ ее исправить. Это кажется
spawn()
ошибкой, если программа была добавлена в PATH пользователем (например, работают нормальные системные команды).Чтобы это исправить, вы можете использовать which module (
npm install --save which
):источник
Используйте
require('child_process').exec
вместо spawn для более конкретного сообщения об ошибке!например:
источник
Убедитесь, что модуль для выполнения установлен или полный путь к команде, если это не модуль узла
источник
Я также проходил через эту досадную проблему, выполняя свои тестовые случаи, поэтому я попробовал много способов решить эту проблему. Но способ для меня - запустить ваш тестовый прогон из каталога, в котором находится ваш главный файл, который включает в себя функцию spawn для nodejs, примерно так:
Например, это имя файла test.js , поэтому просто перейдите в папку, в которой он находится . В моем случае это тестовая папка:
тогда от запуска вашего тестового бегуна в моем случае его мокко, так что это будет так:
Я потратил больше одного дня, чтобы понять это. Наслаждаться!!
источник
Я столкнулся с этой проблемой в Windows, где вызов
exec
иspawn
с точно такой же командой (без аргументов) работал нормальноexec
(поэтому я знал, что моя команда была включена$PATH
), ноspawn
дал ENOENT. Оказалось, что мне просто нужно добавить.exe
команду, которую я использовал:источник
Я получал эту ошибку при попытке отладки программы node.js из редактора кода VS в системе Debian Linux. Я заметил, что та же самая вещь работала хорошо на Windows. Решения, ранее приведенные здесь, не сильно помогли, потому что я не написал никаких команд "spawn". Оскорбительный код предположительно был написан Microsoft и спрятан под капотом программы VS Code.
Затем я заметил, что node.js называется node в Windows, но в Debian (и, вероятно, в системах на основе Debian, таких как Ubuntu) он называется nodejs. Итак, я создал псевдоним - из корневого терминала я запустил
ln -s / usr / bin / nodejs / usr / local / bin / node
и это решило проблему. Эта же или аналогичная процедура, вероятно, будет работать в других случаях, когда ваш node.js называется nodejs, но вы запускаете программу, которая ожидает, что он будет назван node, или наоборот.
источник
Если вы работаете в Windows, Node.js делает несколько забавных операций с кавычками, что может привести к тому, что вы введете команду, которая, как вы знаете, работает из консоли, но не работает при работе в Node. Например, должно работать следующее :
но не удается. Есть фантастически недокументированная опция
windowsVerbatimArguments
для обработки кавычек / подобных, которая, кажется, делает свое дело, просто добавьте следующее к вашему объекту opts:и ваша команда должна вернуться в дело.
источник
решение в моем случае
источник
.cmd
, но потерпит неудачу в тесте jest. - Эта ошибка может быть довольно трудно понять, этот ответ заслуживает большего количества голосов.В случае , если вы столкнулись с этой проблемой с приложением, источником которого вы не можете изменить рассмотреть применение его с помощью переменной окружения
NODE_DEBUG
набора кchild_process
, напримерNODE_DEBUG=child_process yarn test
. Это предоставит вам информацию о том, какие командные строки были вызваны, в каком каталоге и, как правило, последняя деталь является причиной сбоя.источник
Хотя для некоторых людей это может быть путь к среде или другая проблема, я только что установил расширение Latex Workshop для кода Visual Studio в Windows 10 и увидел эту ошибку при попытке создать / просмотреть PDF. Запуск VS Code от имени администратора решил проблему для меня.
источник
Я получил ту же ошибку для Windows 8. Проблема в том, что отсутствует переменная окружения вашего системного пути. Добавьте значение «C: \ Windows \ System32 \» в системную переменную PATH.
источник
Добавить
C:\Windows\System32\
кpath
переменную окружения.меры
Перейти на мой компьютер и свойства
Нажмите на Дополнительные настройки
Тогда по переменным среды
Выберите,
Path
а затем нажмите на редактироватьВставьте следующее, если его еще нет:
C:\Windows\System32\
Закройте командную строку
Запустите команду, которую вы хотели запустить
источник