2013-07-19 9 views
14

私はnode.jsアプリをディレクトリ内のすべてのファイル.txtを再帰的にリストするようにしました。それぞれの場合、いくつかの処理を行います。NodeJS:throw er;

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: spawn ENOENT 
    at errnoException (child_process.js:980:11) 
    at Process.ChildProcess._handle.onexit (child_process.js:771:34) 

私はwin32環境でノードv0.10.13を使用しています:私は、コンソール経由でnode app.jsを実行すると

var spawn = require('child_process').spawn, 
    dir = spawn('dir', ['*.txt', '/b']); 

dir.stdout.on('data', function (data) { 
    //do some stuff with each stdout line... 
    console.log('stdout: ' + data); 
}); 

dir.stderr.on('data', function (data) { 
    //throw errors 
    console.log('stderr: ' + data); 
}); 

dir.on('close', function (code) { 
    console.log('child process exited with code ' + code); 
}); 

が、私は以下のエラーメッセージが表示されます:

は、ここに私のapp.jsです。

私はライン(1つの文字列としてのexec方法リリース全体stdout)によってstdoutラインを処理したいので、私はこの方法(産卵)を行います。

* UPDATE *

ところで、child_processためspawnを使用すると、cmd dirの出力はラインごとになることを保証するものではありません。 question for thatも作成しました。

答えて

17

これは、dirがWindowsで実行可能ではないために発生します。それはシェルからのコマンドです。
あなたの問題の解決策は以下の通りです:

var dir = spawn('cmd', ['/c', 'dir']); 
dir.stdout.on("data", function() { 
    // do things 
}) 

この正確な問題もhereました。

+1

Downvoter、理由を説明できますか? – gustavohenke

+4

私はdownvoteしませんでしたが、この答えは実際には答えていません - エラーをキャプチャするon( 'error'、fn)ハンドラをどこに添付すればいいですか? –

+0

@AlexMillsここに本当の質問はありません。 :)また、 'error'ハンドラは、生成されたプロセスにアタッチする必要があります。 – gustavohenke

12

いくつかのこと:Node.jsのは、あなたが実行したいプログラムを見つけることができませんので

  • dirは、ウィンドウ内の実際の実行可能ではありません。
  • 'error'ハンドラを子プロセスにバインドせず、イベントがノードインスタンスをクラッシュさせた例外に変わりました。代わりに
 
dir.on('error', function (err) { 
    console.log('dir error', err); 
}); 
  • 使用fs.readdir:これを行います。これは同じことをする標準のnode.js APIです。