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





8 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 .

sync start child

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

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)

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

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

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




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

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



Для тех, кто может наткнуться на это, если все остальные ответы не помогут, а вы в Windows, знайте, что в настоящее время существует большая проблема с spawn в Windows и PATHEXT среды PATHEXT которая может вызвать определенные вызовы, чтобы икру не работала в зависимости о том, как установлена ​​целевая команда.




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

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




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




решение в моем случае

var spawn = require('child_process').spawn;

const isWindows = /^win/.test(process.platform); 

spawn(isWindows ? 'twitter-proxy.cmd' : 'twitter-proxy');
spawn(isWindows ? 'http-server.cmd' : 'http-server');



У меня такая же ошибка для Windows 8. Проблема в том, что отсутствует переменная среды вашего системного пути. Добавьте значение «C: \ Windows \ System32 \» в переменную PATH вашей системы.




Я также сталкивался с этой неприятной проблемой при выполнении моих тестовых случаев, поэтому я попробовал много способов преодолеть это. Но для меня это работает, чтобы запустить тестовый бегун из каталога, который содержит ваш основной файл, который включает в себя вашу функцию spawn nodejs :

nodeProcess = spawn('node',params, {cwd: '../../node/', detached: true });

Например, это имя файла test.js , поэтому просто перейдите в папку, которая содержит его . В моем случае это тестовая папка:

cd root/test/

то из запуска вашего тестового бегуна в моем случае его мокко так будет:

mocha test.js

Я потратил впустую больше, чем один день, чтобы понять это. Наслаждаться!!




Related