Как отладить "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 (странный случай)
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установленесть два возможных сценария:
- вы полагаетесь на значение по умолчанию
spawnповедение, поэтому среда дочернего процесса будет такой же, какprocess.env.- вы явно передаете
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правильно установлен иcommandis доступный из него, вы должны быть в состоянии породить свой детский процесс без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переменные среды.шаги
Иди ко мне компьютер и свойства
нажать на кнопку Дополнительные параметры
затем на переменные среды
выберите
Pathа затем нажмите на Редактироватьвставьте следующее, если еще нет:
C:\Windows\System32\закройте командную строку
выполните команду, которую вы хотели запустить

Comments