Как отлаживать «Ошибка: вызвать ENOENT» на node.js?


7 Answers

Шаг 1: Убедитесь, что spawn называется правильным способом

Сначала просмотрите документы для child_process.spawn (команда, args, options) :

Запускает новый процесс с заданной command с аргументами командной строки в args . Если опустить, args умолчанию использует пустой массив.

Третий аргумент используется для указания дополнительных параметров, по умолчанию:

{ cwd: undefined, env: process.env }

Используйте env для указания переменных среды, которые будут видимы для нового процесса, по умолчанию - process.env .

Убедитесь, что вы не вводите аргументы командной строки в command и весь вызов spawn действителен . Перейдите к следующему шагу.

Шаг 2. Идентифицируйте излучатель событий, который испускает событие ошибки.

Поиск по исходному коду для каждого вызова для spawn или child_process.spawn , т.е.

spawn('some-command', [ '--help' ]);

и прикрепите там прослушиватель событий для события «error», чтобы вы заметили точный Event Emitter, который бросает его как «Unhandled». После отладки этот обработчик можно удалить.

spawn('some-command', [ '--help' ])
  .on('error', function( err ){ throw err })
;

Выполните, и вы должны получить путь к файлу и номер строки, где был зарегистрирован ваш прослушиватель ошибок. Что-то вроде:

/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)

Если первые две строки все еще

events.js:72
        throw er; // Unhandled 'error' event

сделайте этот шаг снова, пока они не станут. Вы должны определить слушателя, который испускает ошибку, прежде чем перейти к следующему шагу.

Шаг 3. Убедитесь, что переменная среды $PATH установлена.

Возможны два сценария:

  1. Вы полагаетесь на поведение spawn по умолчанию, поэтому дочерняя среда процесса будет такой же, как process.env .
  2. Вы - экспликация, передающая объект env для spawn аргумента options .

В обоих сценариях вы должны проверить ключ PATH на объекте среды, который будет использоваться дочерним процессом.

Пример для сценария 1

// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);

Пример для сценария 2

var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });

Отсутствие PATH (т. undefined ) приведет к тому, что spawn испустит ошибку ENOENT , так как не удастся найти какую-либо command если это не абсолютный путь к исполняемому файлу.

Когда PATH установлен правильно, перейдите к следующему шагу. Это должен быть каталог или список каталогов. Последний случай - обычный.

Шаг 4: Убедитесь, что command существует в каталоге тех, которые определены в PATH

Spawn может испускать ошибку ENOENT если команда имени файла (т. ENOENT « ENOENT команда») не существует, по крайней мере, в одной из каталогов, определенных в PATH .

Найдите точное место command . В большинстве дистрибутивов Linux это можно сделать с терминала с помощью команды. Он укажет вам абсолютный путь к исполняемому файлу (например, выше) или сообщите, не найден ли он.

Пример использования которого и его вывод при обнаружении команды

> which some-command
some-command is /usr/bin/some-command

Пример использования которого и его выход, когда команда не найдена

> which some-command
bash: type: some-command: not found

прошитые программы являются наиболее распространенной причиной для не найденной команды. При необходимости обратитесь к каждой документации команды и установите ее.

Когда команда представляет собой простой файл сценария, убедитесь, что он доступен из каталога в PATH . Если это не так, переместите его на один или сделайте ссылку на него.

Как только вы определяете, что PATH правильно установлен, и command доступна из него, вы должны иметь возможность запускать дочерний процесс без spawn ENOENT .

Question

Когда я получаю следующую ошибку:

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)

Какую процедуру я могу выполнить, чтобы исправить это?

Примечание автора : Многие проблемы с этой ошибкой побудили меня опубликовать этот вопрос для будущих ссылок.

Связанные вопросы:




Добавьте C:\Windows\System32\ в переменную среды path .

меры

  1. Перейдите на мой компьютер и свойства

  2. Нажмите « Дополнительные настройки».

  3. Затем по переменным среды

  4. Выберите « Path и нажмите «Изменить».

  5. Вставьте следующие, если они еще не присутствуют: C:\Windows\System32\

  6. Закройте командную строку

  7. Запустите команду, которую вы хотите запустить




Я получал эту ошибку при попытке отладки программы node.js из редактора VS Code в системе Debian Linux. Я заметил, что в Windows все работает нормально. Решения, приведенные здесь ранее, не помогли, потому что я не написал никаких команд «икры». Оскорбительный код предположительно был написан Microsoft и скрыт под капотом программы VS Code.

Затем я заметил, что node.js называется узлом в Windows, но на Debian (и, предположительно, в системах на базе Debian, таких как Ubuntu), он называется nodejs. Поэтому я создал псевдоним - от корневого терминала, я побежал

ln -s / usr / bin / nodejs / usr / local / bin / node

и это решило проблему. Такая же или аналогичная процедура, по-видимому, будет работать в других случаях, когда ваш node.js называется nodejs, но вы запускаете программу, которая ожидает, что она будет называться узлом, или наоборот.




Если вы находитесь в Windows, Node.js делает некоторые забавные дела при обработке кавычек, которые могут привести к выдаче команды, которую вы знаете, работает с консоли, но не выполняется при запуске в узле. Например, следующее должно работать:

spawn('ping', ['"8.8.8.8"'], {});

но не удается. Существует фантастически недокументированная опция windowsVerbatimArguments для обработки кавычек / подобных, которые, похоже, делают трюк, просто добавьте следующее к вашему объекту opts:

const opts = {
    windowsVerbatimArguments: true
};

и ваша команда должна вернуться в бизнес.

 spawn('ping', ['"8.8.8.8"'], { windowsVerbatimArguments: true });



В моем случае я получал эту ошибку, вызванную из-за того, что необходимые зависимые системные ресурсы не были установлены.

В частности, у меня есть приложение NodeJS, которое использует ImageMagick. Несмотря на то, что установлен пакет npm, ядро ​​Linux ImageMagick не было установлено. Я сделал apt-get, чтобы установить ImageMagick, и после этого все отлично работало!




Убедитесь, что установлен модуль, или полный путь к команде, если он не является узловым модулем




Решение для Windows: Замените spawn с помощью node-cross-spawn . Например, например, в начале вашего app.js:

(function() {
    var childProcess = require("child_process");
    childProcess.spawn = require('cross-spawn');
})(); 



Ответ @ laconbass помог мне и, вероятно, самый правильный.

Я пришел сюда, потому что неправильно использовал породу. В качестве простого примера:

это неверно:

const s = cp.spawn('npm install -D suman', [], {
    cwd: root
});

это неверно:

const s = cp.spawn('npm', ['install -D suman'], {
    cwd: root
});

это верно:

const s = cp.spawn('npm', ['install','-D','suman'], {
    cwd: root
});



Related