540 Stimmen

Wie debugge ich "Fehler: spawn ENOENT" in node.js?

32voto

Alexander Mills Punkte 76733

Die Antwort von @laconbass hat mir geholfen und ist wahrscheinlich am korrektesten.

Ich bin hierher gekommen, weil ich spawn falsch verwendet habe. Als einfaches Beispiel:

das ist falsch:

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

das ist falsch:

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

das ist richtig:

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

allerdings empfehle ich es auf diese Weise zu machen:

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

denn dann wird das cp.on('exit', fn) Ereignis immer ausgelöst, solange bash installiert ist, sonst könnte das cp.on('error', fn) Ereignis zuerst ausgelöst werden, wenn wir es auf die erste Art und Weise verwenden, wenn wir 'npm' direkt starten.

31voto

Li Zheng Punkte 617

Für ENOENT unter Windows, https://github.com/nodejs/node-v0.x-archive/issues/2318#issuecomment-249355505 beheben.

Zum Beispiel ersetzen Sie spawn('npm', ['-v'], {stdio: 'inherit'}) mit:

  • für alle node.js Versionen:

    spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['-v'], {stdio: 'inherit'})
  • für node.js 5.x und höher:

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

25voto

laconbass Punkte 15514

Wie man den Fehler beim Spawn-Aufruf erforscht:

Bekannte, übliche Ursachen

  1. Umweltprobleme

    • Das ausführbare Kommando existiert nicht im System (Abhängigkeit ist nicht installiert). siehe Antwort von prominc
    • Das ausführbare Kommando existiert nicht in einem Verzeichnis, das von der Umgebungsvariable PATH angegeben wurde.
    • Das ausführbare Binärmodul wurde mit unkompatiblen Bibliotheken kompiliert. siehe Antwort von danilo-ramirez
  2. Nur für Windows-Bugs/Macken

  3. Falsche Verwendung von spawn('Befehl', ['--Argument', 'Liste'], { cwd, env, ...opts })

    • Angegebenes Arbeitsverzeichnis (opts.cwd) existiert nicht · siehe Antwort von leeroy-brun
    • Argumentliste innerhalb von Befehl String spawn('Befehl --falsch --Argument Liste')
    • Env-Variablen innerhalb von Befehlszeichenkette spawn('ENV_VAR=FALSCH Befehl')
    • Argumentliste Array angegeben als String spawn('cmd', '--Argument Liste')
    • Unset PATH Umgebungsvariable spawn('cmd', [], { env: { variable } } => spawn('cmd', [], { env: { ...process.env, variable } }

Es gibt 2 mögliche Ursprünge für ENOENT:

  1. Der von Ihnen geschriebene Code
  2. Der von Ihnen abhängige Code

Wenn der Ursprung der Code ist, von dem Sie abhängig sind, ist die übliche Ursache ein Umweltproblem (oder ein Windows-Problem)


22voto

Alex Turpin Punkte 45303

Für alle, die darauf stoßen könnten, wenn alle anderen Antworten nicht helfen und Sie Windows verwenden, wissen Sie, dass es derzeit ein großes Problem mit spawn unter Windows und der Umgebungsvariablen PATHEXT gibt, das dazu führen kann, dass bestimmte Aufrufe von spawn je nach Installation des Zielbefehls nicht funktionieren.

11voto

PromInc Punkte 1134

In meinem Fall wurde dieser Fehler geworfen, weil die erforderlichen abhängigen Systemressourcen nicht installiert waren.

Genauer gesagt habe ich eine NodeJS-App, die ImageMagick verwendet. Trotz der Installation des npm-Pakets war das Kern-Linux-ImageMagick nicht installiert. Ich habe ein apt-get zum Installieren von ImageMagick durchgeführt, und danach hat alles super funktioniert!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X