Как отладить "Error: spawn ENOENT"на узле.Джей?



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



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)


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



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



вопросы:




  • используя функцию spawn с NODE_ENV=production

  • узел.js child_process.spawn ENOENT error-только под супервизором

  • spawn ENOENT узел.js ошибка

  • https://stackoverflow.com/questions/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package

  • узел JS-child_process spawn ('npm install') в задаче Grunt приводит к ошибке ENOENT

  • запуск задачи "бригадир" фатальная ошибка: spawn ENOENT

  • необработанное событие ошибки в узле JS Error: spawn ENOENT at errnoException (child_process.js: 975: 11)

  • узел.js SpookyJS: ошибка выполнения привет.js

  • https://stackoverflow.com/questions/26572214/run-grunt-on-a-directory-nodewebkit

  • запустите exe-файл с дочерним процессом NodeJS

  • узел: child_process.spawn не работает на Java, даже если он находится в пути (ENOENT)


  • spawn ENOENT ошибка с NodeJS (PYTHON related)


  • изменение размера изображения не работает в узле.js (частично.js) (неустановленная зависимость)


  • npm install error ENOENT (build dependency проблема)


  • Не удается установить узел.JS-модуль oracle в Windows 7 (проблема зависимости сборки)


  • Ошибка установки gulp с помощью nodejs на windows (странный случай)

981   16  

16 ответов:

Я нашел особенно простой способ получить представление о первопричине:

Error: spawn ENOENT

проблема этой ошибки заключается в том, что в сообщении об ошибке действительно мало информации, чтобы сообщить вам, где находится сайт вызова, т. е. какой исполняемый файл/команда не найден, особенно когда у вас есть большая база кода, где есть много вызовов spawn. С другой стороны, если мы знаем точную команду, которая вызывает ошибку, то мы можем следовать @laconbass' ответ исправить проблема.

Я нашел очень простой способ определить, какая команда вызывает проблему, а не добавлять прослушиватели событий везде в вашем коде, как это предлагается в ответе @laconbass. Ключевая идея заключается в том, чтобы обернуть исходный вызов spawn с помощью оболочки, которая печатает аргументы, отправляемые в вызов spawn.

вот функция обертки, поместите ее в верхней части index.js или любой другой сценарий запуска вашего сервера.

(function() {
    var childProcess = require("child_process");
    var oldSpawn = childProcess.spawn;
    function mySpawn() {
        console.log('spawn called');
        console.log(arguments);
        var result = oldSpawn.apply(this, arguments);
        return result;
    }
    childProcess.spawn = mySpawn;
})();

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

spawn called
{ '0': 'hg',
  '1': [],
  '2':
   { cwd: '/* omitted */',
     env: { IP: '0.0.0.0' },
     args: [] } }

таким образом, вы можете легко узнать, какая команда на самом деле выполняется, а затем вы можете узнать, почему nodejs не может найти исполняемый файл, чтобы исправить проблему.

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

во-первых, рассмотреть docs for child_process.spawn (command, 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", чтобы вы заметили точный эмиттер событий, который бросает его как "необработанный". После отладки этот обработчик может быть удален.

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

икра может испускать ENOENT ошибка, если имя файла command (т. е. 'some-command') не существует по крайней мере в одном из каталогов, определенных на 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 is доступный из него, вы должны быть в состоянии породить свой детский процесс без spawn ENOENT быть брошенным.

Как @DanielImfeld указал на него, ENOENT будет брошен, если вы укажете "cwd" в параметрах, но данный каталог не существует.

решение для Windows: заменить spawn С node-cross-spawn. Например, как это в начале вашего приложения.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
});

однако, я рекомендую сделать это таким образом:

const s = cp.spawn('bash');
s.stdin.end(`cd "${root}" && npm install -D suman`);
s.once('exit', code => {
   // exit
});

это потому, что тогда cp.on('exit', fn) событие всегда будет срабатывать, пока как bash устанавливается, в противном случае,cp.on('error', fn) событие может сработать первым, если мы используем его первым способом, если мы запускаем 'npm' напрямую.

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

для ENOENT на Windows,https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 исправьте это.

например, замените spawn ('npm', ['- v'], {stdio: 'inherit'}) на:

  • для всех узлов.Яш версия:

    spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['-v'], {stdio: 'inherit'})
    
  • для узла.js 5.X и позже:

    spawn('npm', ['-v'], {stdio: 'inherit', shell: true})
    

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

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

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

чтобы исправить это, вы можете использовать , который модуль (npm install --save which):

// Require which and child_process
const which = require('which');
const spawn = require('child_process').spawn;
// Find npm in PATH
const npm = which.sync('npm');
// Execute
const noErrorSpawn = spawn(npm, ['install']);

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

использовать require('child_process').exec вместо икры для более конкретного сообщения об ошибке!

например:

var exec = require('child_process').exec;
var commandStr = 'java -jar something.jar';

exec(commandStr, function(error, stdout, stderr) {
  if(error || stderr) console.log(error || stderr);
  else console.log(stdout);
});

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

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

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

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

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

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

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

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

const opts = {
    windowsVerbatimArguments: true
};

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

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

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

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

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

cd root/test/

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

mocha test.js

Я потратил не один день, чтобы понять это. Наслаждайтесь!!

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

шаги

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

  2. нажать на кнопку Дополнительные параметры

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

  4. выберите Path а затем нажмите на Редактировать

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

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

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

Windows 8 Environment variables screenshot

Comments

    Ничего не найдено.