540 Stimmen

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

2voto

Gum Joe Punkte 45

Ich bin auf das gleiche Problem gestoßen, aber ich habe einen einfachen Weg gefunden, es zu beheben. Es scheint, dass spawn() Fehler auftreten, wenn das Programm vom Benutzer zum PATH hinzugefügt wurde (z. B. normale Systembefehle funktionieren).

Um dies zu beheben, können Sie das which Modul verwenden (npm install --save which):

// Erforderlich which und child_process
const which = require('which');
const spawn = require('child_process').spawn;
// npm im PATH finden
const npm = which.sync('npm');
// Ausführen
const noErrorSpawn = spawn(npm, ['install']);

2voto

Danilo Ramirez Punkte 1488

Ein Fall, den ich gefunden habe, der nicht in dieser Liste steht, aber es lohnt sich, ihn hinzuzufügen:

Auf Alpine Linux wird Node mit ENOENT einen Fehler anzeigen, wenn das ausführbare Programm nicht kompatibel ist.

Alpine erwartet Binärdateien mit libc. Ein ausführbares Programm (z.B. chrome als Teil von Chromium), das mit glibc als Wrapper für Systemaufrufe kompiliert wurde, wird mit ENOENT scheitern, wenn es von spawn aufgerufen wird.

1voto

Rajkumar Bansal Punkte 183

Auch ich hatte dieses lästige Problem beim Ausführen meiner Testfälle, also habe ich viele Möglichkeiten ausprobiert, um es zu lösen. Aber der Weg, der für mich funktioniert, ist es, Ihren Test-Runner vom Verzeichnis aus zu starten, das Ihre Hauptdatei enthält, die Ihre Node.js-Spawn-Funktion enthält, etwa so:

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

Zum Beispiel, diese Dateiname ist test.js, also bewegen Sie sich in den Ordner, der es enthält. Bei mir ist es der Testordner, so wie hier:

cd root/test/

dann führen Sie Ihren Test-Runner aus, in meinem Fall ist es mocha, also wird es so aussehen:

mocha test.js

Ich habe mehr als einen Tag damit verbracht, das herauszufinden. Viel Spaß!!

1voto

Dan Alboteanu Punkte 7808

Lösung in meinem Fall

var spawn = require('child_process').spawn;

const isWindows = /^win/.test(process.platform); 

spawn(isWindows ? 'twitter-proxy.cmd' : 'twitter-proxy');
spawn(isWindows ? 'http-server.cmd' : 'http-server');

1voto

MostlyArmless Punkte 68

Ich bin auf dieses Problem unter Windows gestoßen, wo das Aufrufen von exec und spawn mit dem genau gleichen Befehl (ohne Argumente) für exec gut funktionierte (also wusste ich, dass mein Befehl auf $PATH war), aber spawn ENOENT zurückgab. Es stellte sich heraus, dass ich einfach .exe an den Befehl anhängen musste, den ich verwendete:

import { exec, spawn } from 'child_process';

// Das funktioniert gut
exec('p4 changes -s submitted');

// Hier tritt der ENOENT-Fehler auf
spawn('p4');

// Aber damit wird das Problem gelöst
spawn('p4.exe');
// Funktioniert sogar mit den Argumenten jetzt
spawn('p4.exe', ['changes', '-s', 'submitted']);

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