540 Stimmen

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

11voto

InsOp Punkte 1783

Bevor jemand zu viel Zeit damit verbringt, dieses Problem zu debuggen, kann es in den meisten Fällen gelöst werden, indem node_modules gelöscht und die Pakete neu installiert werden.

Installation:

Wenn eine Sperrdatei existiert, könnten Sie

yarn install --frozen-lockfile

oder

npm ci

verwenden. Wenn nicht, dann

yarn install

oder

npm i

6voto

Kalle Richter Punkte 7115

Wenn Sie dieses Problem mit einer Anwendung erleben, deren Quellcode Sie nicht ändern können, sollten Sie versuchen, sie mit der Umgebungsvariable NODE_DEBUG auf child_process zu starten, z.B. NODE_DEBUG=child_process yarn test. Dadurch erhalten Sie Informationen darüber, welche Befehle in welchem Verzeichnis aufgerufen wurden, wobei normalerweise das letzte Detail der Grund für das Problem ist.

6voto

Rico Kahler Punkte 15352

Ändern Sie die env Option?

Dann schauen Sie sich diese Antwort an.


Ich habe versucht, einen Node-Prozess zu starten, und heute habe ich gelernt, dass Sie die vorhandenen Umgebungsvariablen verbreiten sollten, wenn Sie einen neuen Prozess starten, sonst verlieren Sie die Umgebungsvariable PATH und möglicherweise andere wichtige Variablen.

Das war die Lösung für mich:

const nodeProcess = spawn('node', ['--help'], {
  env: {
    // standardmäßig verwendet spawn `process.env` als Wert für `env`
    // Sie können dieses Verhalten _erweitern_, indem Sie `process.env` verbreiten
    ...process.env,
    OTHER_ENV_VARIABLE: 'test',
  }
});

3voto

treckstar Punkte 822

Beim Bauen von gulp-jekyll in Powershell auf Windows 11 ist mir Folgendes passiert.

nodejs 10 LTS, gulp v3.9.1, ruby 3.1, bundler 2.4.5, jekyll 4.2.2

Diese Codezeile hier ist die Ursache des ENOENT-Problems, das ich mit spawn und bundle hatte.

  return cp.spawn('bundle', [
    'exec', 
    'jekyll', 
    'build', 
    '--source=app', '--destination=build/development', '--config=_config.yml', '--profile'
  ], { stdio: 'inherit' })
  .on('close', done);

Zwei Fehler wurden zurückgegeben, und die Fehlersuche sollte hier beginnen.

events.js:174
      throw er; // Unhandled 'error' event
      ^
Error: spawn bundle ENOENT

Das cp.spawn behandelt kein Fehlerereignis, also wird das durch ein einfaches console.log() behoben, um den wirklichen Fehler mit Debug-Informationen aufzudecken:

  return cp.spawn('bundle', [
    'exec', 
    'jekyll', 
    'build', 
    '--source=app', '--destination=build/development', '--config=_config.yml', '--profile'
  ], { stdio: 'inherit' })
  .on('error', (e) => console.log(e))
  .on('close', done);

Damit stehen nun wesentlich mehr Informationen für die Debugging zur Verfügung.

{ Error: spawn bundle ENOENT
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn bundle',
  path: 'bundle',
  spawnargs:
   [ 'exec',
     'jekyll',
     'build',
     '--source=app',
     '--destination=build/development',
     '--config=_config.yml',
     '--profile' ] }

Der nächste Schritt zur Fehlerbehebung wäre die Verwendung der nodejs 10 LTS-Dokumentation für child_process.spawn(command[, args][, options]). Wie bereits oben beschrieben, ist das Hinzufügen von { shell: true } zu den Optionen von spawn eine funktionierende Lösung. Das hat auch mein Problem gelöst.

  { stdio: 'inherit', shell: true }

Diese Lösung ist nur ein Provisorium und könnte so umgeschrieben werden, dass sie alle Umgebungen behandelt, aber das fällt nicht in den Rahmen dessen, wie man den spawn ENOENT-Fehler auf nodejs debuggt.

2voto

Zack Punkte 1537

Verwenden Sie require('child_process').exec anstelle von spawn für eine spezifischere Fehlermeldung!

zum Beispiel:

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);
});

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