node.js で「エラー: spawn ENOENT」をデバッグするにはどうすればいいですか? 質問する

node.js で「エラー: 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)

これを修正するにはどのような手順を実行すればよいでしょうか?

著者注: このエラーに関する多くの問題が、将来の参考のためにこの質問を投稿するきっかけとなりました。

関連する質問:

ベストアンサー1

注意: このエラーは、ほとんどの場合、コマンドが存在しない、作業ディレクトリが存在しない、または Windows のみのバグが原因で発生します。

私は、次の根本的な原因を理解するための特に簡単な方法を見つけました。

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 が実行可能ファイルを見つけられない理由を見つけて問題を修正できます。

おすすめ記事