Quando recebo o seguinte erro:
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)
Que procedimento posso seguir para corrigi-lo?
Nota do autor : Muitos problemas com esse erro me incentivaram a postar esta pergunta para futuras referências.
Perguntas relacionadas:
- usando a função de desova com NODE_ENV = produção
- node.js child_process.spawn erro ENOENT - apenas sob supervisão
- erro de spawn ENOENT node.js
- /programming/27603713/nodejs-spawn-enoent-error-on-travis-calling-global-npm-package
- Nó JS - spawn child_process ('npm install') na tarefa Grunt resulta em erro ENOENT
- Executando a tarefa "capataz" Erro fatal: spawn ENOENT
- evento de erro não tratado no nó js Erro: spawn ENOENT at errnoException (child_process.js: 975: 11)
- Node.js SpookyJS: erro ao executar o hello.js
- /programming/26572214/run-grunt-on-a-directory-nodewebkit
- Executar arquivo exe com NodeJS de processo filho
- Nó: child_process.spawn não está funcionando no Java, mesmo estando no caminho (ENOENT)
- gerar erro ENOENT com NodeJS (relacionado ao PYTHON)
- o redimensionamento de imagem não está funcionando no node.js (parcial.js) (dependência não instalada)
- erro de instalação npm ENOENT (problema de dependência de compilação)
- Não é possível instalar o node.js - módulo oracle no Windows 7 (problema de dependência de compilação)
- Erro ao instalar o gulp usando o nodejs no Windows (caso estranho)
node.js
debugging
error-handling
child-process
spawn
laconbass
fonte
fonte
exec
vez de passar o comando como o primeiro argumento e as opções como uma Matriz para o segundo argumento. por exemplo, eu estava fazendo emspawn( "adb logcat -c" )
vez despawn( "adb", [ "logcat", "-c" ] )
.Respostas:
NOTA: Esse erro quase sempre é causado porque o comando não existe, porque o diretório de trabalho não existe ou devido a um bug somente do Windows.
Eu encontrei uma maneira particularmente fácil de entender a causa raiz de:
O problema desse erro é que há realmente pouca informação na mensagem de erro para informar onde está o site de chamada, ou seja, qual executável / comando não foi encontrado, especialmente quando você tem uma grande base de códigos em que há muitas chamadas de spawn . Por outro lado, se soubermos o comando exato que causa o erro, podemos seguir a resposta do @laconbass para corrigir o problema.
Encontrei uma maneira muito fácil de identificar qual comando causou o problema, em vez de adicionar ouvintes de eventos em todo o código, como sugerido na resposta do @laconbass. A idéia principal é agrupar a chamada de desova original com um invólucro que imprima os argumentos enviados para a chamada de desova.
Aqui está a função wrapper, coloque-a na parte superior do
index.js
script inicial do servidor ou seja lá o que for.Da próxima vez que você executar seu aplicativo, antes da mensagem da exceção não capturada, você verá algo assim:
Dessa maneira, você pode saber facilmente qual comando realmente é executado e, em seguida, descobrir por que o nodejs não consegue encontrar o executável para corrigir o problema.
fonte
spawn()
paraexec()
e tentar novamente.exec()
lhe dirá qual comando ele tentou executar.Etapa 1: verifique se
spawn
é chamado o caminho certoPrimeiro, revise os documentos para child_process.spawn (command, args, options) :
Verifique se você não está colocando argumentos de linha de comando
command
e se toda aspawn
chamada é válida . Prossiga para a próxima etapa.Etapa 2: identificar o emissor do evento que emite o evento de erro
Pesquise no seu código-fonte cada chamada para
spawn
, ouchild_process.spawn
, iee anexe lá um ouvinte de evento para o evento 'error', para que você seja notado exatamente o emissor do evento que está lançando-o como 'Unhandled'. Após a depuração, esse manipulador pode ser removido.
Execute e você deve obter o caminho do arquivo e o número da linha em que o ouvinte 'erro' foi registrado. Algo como:
Se as duas primeiras linhas ainda estiverem
faça este passo novamente até que não estejam. Você deve identificar o ouvinte que emite o erro antes de prosseguir na próxima etapa.
Etapa 3: verifique se a variável de ambiente
$PATH
está definidaExistem dois cenários possíveis:
spawn
comportamento padrão , portanto, o ambiente do processo filho será o mesmo queprocess.env
.env
objeto paraspawn
ooptions
argumento.Nos dois cenários, você deve inspecionar a
PATH
chave no objeto de ambiente que o processo filho gerado usará.Exemplo para o cenário 1
Exemplo para o cenário 2
A ausência de
PATH
(ou seja, éundefined
) causaráspawn
oENOENT
erro , pois não será possível localizar nenhum, acommand
menos que seja um caminho absoluto para o arquivo executável.Quando
PATH
estiver definido corretamente, prossiga para a próxima etapa. Deve ser um diretório ou uma lista de diretórios. O último caso é o habitual.Etapa 4: verifique se
command
existe em um diretório daqueles definidos emPATH
O spawn pode emitir o
ENOENT
erro se o nome do arquivocommand
(por exemplo, 'algum comando') não existir em pelo menos um dos diretórios definidos emPATH
.Localize o local exato de
command
. Na maioria das distribuições linux, isso pode ser feito a partir de um terminal com owhich
comando Ele informará o caminho absoluto para o arquivo executável (como acima), ou informará se ele não foi encontrado.Exemplo de uso de qual e sua saída quando um comando é encontrado
Exemplo de uso de qual e sua saída quando um comando não for encontrado
programas instalados com falta são a causa mais comum de um comando não encontrado . Consulte a documentação de cada comando, se necessário, e instale-o.
Quando o comando é um arquivo de script simples, verifique se ele é acessível a partir de um diretório no
PATH
. Caso contrário, mova-o para um ou faça um link para ele.Depois de determinar que
PATH
está definido corretamente ecommand
é acessível a partir dele, você poderá gerar o processo filho semspawn ENOENT
ser jogado.fonte
cwd
nas opções, mas o diretório fornecido não existe.spawn('some-command', ['--help'], { env: env });
como exemplificado pela Etapa 3 nesta resposta e estão passando um ambiente personalizado, certifique-se de especificar aPATH
, por exemplo:{ env: { PATH: process.env.PATH } }
. A opção env não herdará variáveis do seu env atual por padrão.shell: true
para as opções de desova.Como @DanielImfeld apontou , ENOENT será lançado se você especificar "cwd" nas opções, mas o diretório fornecido não existir.
fonte
cwd
caminho: 'c: / ...' e não apenas '/ ...'Solução do Windows: Substitua
spawn
por nó-cross-spawn . Por exemplo, no início do seu app.js:fonte
var spawn = require('cross-spawn');
// Spawn NPM asynchronously var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
A resposta de @ laconbass me ajudou e é provavelmente a mais correta.
Eu vim aqui porque estava usando o spawn incorretamente. Como um exemplo simples:
isto está incorreto:
isto está incorreto:
isto está correto:
no entanto, eu recomendo fazê-lo desta maneira:
isso ocorre porque o
cp.on('exit', fn)
evento sempre será acionado, desde que o bash esteja instalado; caso contrário, ocp.on('error', fn)
evento poderá disparar primeiro, se o usarmos da primeira maneira, se iniciarmos o 'npm' diretamente.fonte
child_process.exec
ou passeshell: true
paraspawn
.Para ENOENT no Windows, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 corrigi-lo.
por exemplo, substitua spawn ('npm', ['-v'], {stdio: 'herdar'}) por:
para toda a versão do node.js.
para node.js 5.xe posterior:
fonte
shell: true
Para qualquer um que possa se deparar com isso, se todas as outras respostas não ajudarem e você estiver no Windows, saiba que atualmente há um grande problema
spawn
no Windows e naPATHEXT
variável de ambiente que pode fazer com que certas chamadas sejam geradas não funcionem, dependendo de como o comando target está instalado.fonte
spawn
e apenas useiexec
.No meu caso, eu estava recebendo esse erro devido aos recursos necessários do sistema não estarem instalados.
Mais especificamente, tenho um aplicativo NodeJS que utiliza o ImageMagick. Apesar de ter o pacote npm instalado, o Linux ImageMagick principal não foi instalado. Eu fiz um apt-get para instalar o ImageMagick e depois disso tudo funcionou muito bem!
fonte
no windows, basta adicionar a
shell: true
opção resolvido meu problema:incorreta:
corrigir:
fonte
Você está mudando a
env
opção?Então olhe para esta resposta.
Eu estava tentando gerar um processo de nó e até que você deveria espalhar as variáveis de ambiente existentes ao gerar, caso contrário você perderá a
PATH
variável de ambiente e possivelmente outras importantes.Esta foi a correção para mim:
fonte
Antes que alguém gaste muito tempo depurando esse problema, na maioria das vezes ele pode ser resolvido excluindo
node_modules
e reinstalando os pacotes.Para instalar:
Se existir um arquivo de bloqueio, você poderá usar
ou
respeitosamente. se não então
ou
fonte
Encontrei o mesmo problema, mas encontrei uma maneira simples de corrigi-lo. Parece haver
spawn()
erros se o programa foi adicionado ao PATH pelo usuário (por exemplo, comandos normais do sistema funcionam).Para corrigir isso, você pode usar o que módulo (
npm install --save which
):fonte
Use em
require('child_process').exec
vez de gerar para obter uma mensagem de erro mais específica!por exemplo:
fonte
Certifique-se de que o módulo a ser executado esteja instalado ou o caminho completo para o comando, se não for um módulo de nó
fonte
Eu também estava passando por esse problema irritante enquanto executava meus casos de teste, então tentei várias maneiras de contorná-lo. Mas a maneira que funciona para mim é executar o executor de teste no diretório que contém o arquivo principal, que inclui a função de geração nodejs , algo como isto:
Por exemplo, esse nome de arquivo é test.js , então vá para a pasta que o contém . No meu caso, é uma pasta de teste como esta:
em seguida, execute o seu executor de teste no meu caso, seu mocha, para que fique assim:
Eu desperdicei meu mais de um dia para descobrir isso. Aproveitar!!
fonte
Eu encontrei esse problema no Windows, onde chamar
exec
espawn
com exatamente o mesmo comando (omitindo argumentos) funcionava bemexec
(então eu sabia que meu comando estava ativado$PATH
), masspawn
daria ENOENT. Aconteceu que eu só precisava acrescentar.exe
ao comando que estava usando:fonte
Eu estava recebendo esse erro ao tentar depurar um programa node.js no editor de código VS em um sistema Debian Linux. Notei que a mesma coisa funcionou bem no Windows. As soluções fornecidas anteriormente aqui não ajudaram muito, porque eu não havia escrito nenhum comando "spawn". O código incorreto foi presumivelmente escrito pela Microsoft e oculto sob o capô do programa VS Code.
Em seguida, notei que o node.js é chamado de nó no Windows, mas no Debian (e provavelmente em sistemas baseados no Debian, como o Ubuntu), é chamado de nodejs. Então eu criei um alias - a partir de um terminal raiz, corri
ln -s / usr / bin / nodejs / usr / local / bin / node
e isso resolveu o problema. O mesmo procedimento ou um procedimento semelhante provavelmente funcionará em outros casos em que o node.js é chamado nodejs, mas você está executando um programa que espera que seja chamado de node ou vice-versa.
fonte
Se você estiver no Windows, o Node.js faz alguma coisa engraçada ao manipular cotações que podem resultar na emissão de um comando que você sabe que funciona no console, mas não quando executado no Node. Por exemplo, o seguinte deve funcionar:
mas falha. Existe uma opção fantasticamente não documentada
windowsVerbatimArguments
para lidar com aspas / similar que parece funcionar, basta adicionar o seguinte ao objeto opts:e seu comando deve estar de volta aos negócios.
fonte
solução no meu caso
fonte
.cmd
, mas falharia em um teste de brincadeira datilografado. - Esse erro pode ser bastante difícil de descobrir, essas respostas merecem mais votos.Caso esteja enfrentando esse problema com um aplicativo cuja fonte não pode ser modificada, considere invocá-lo com a variável de ambiente
NODE_DEBUG
definida comochild_process
, por exemploNODE_DEBUG=child_process yarn test
. Isso fornecerá informações sobre quais linhas de comando foram chamadas em qual diretório e, geralmente, o último detalhe é o motivo da falha.fonte
Embora possa ser um caminho do ambiente ou outro problema para algumas pessoas, eu havia acabado de instalar a extensão do Latex Workshop para o Visual Studio Code no Windows 10 e vi esse erro ao tentar criar / visualizar o PDF. A execução do código VS como administrador resolveu o problema para mim.
fonte
O problema é por causa de uma variável de ambiente do caminho do sistema estar ausente. Adicione o valor "C: \ Windows \ System32 \" à variável PATH do sistema.
fonte
Adicione
C:\Windows\System32\
àpath
variável de ambiente.Passos
Vá para o meu computador e propriedades
Clique em Configurações avançadas
Em seguida, nas variáveis de ambiente
Selecione
Path
e clique em editarCole o seguinte, se ainda não estiver presente:
C:\Windows\System32\
Feche o prompt de comando
Execute o comando que você queria executar
fonte