2013-07-19 71 views
14

我製作了一個node.js應用程序,以遞歸方式列出目錄中的所有.txt文件,併爲每個文件做一些操作。NodeJS:扔呃; //使用child_process spawn方法時未處理的'error'事件(events.js:72)

這裏是我的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); 
}); 

當我通過控制檯運行node app.js,我得到以下錯誤信息:

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) 

我使用節點v0.10.13win32環境。

,因爲我要處理由線stdout線(EXEC方法釋放整個stdout作爲一個字符串)我做這樣(產卵)。

* UPDATE *

順便說一句,使用spawnchild_process不保證輸出cmd dir將是一行一行。我也創建了一個question for that

回答

17

發生這種情況是因爲dir在Windows中不是可執行文件。這是一個來自shell的命令。
你的問題的解決方案如下:

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

這種確切的問題是here也。

+1

Downvoter,你能解釋一下爲什麼嗎? – gustavohenke

+4

我沒有downvote,但這個答案並沒有真正回答這個問題 - 我們在哪裏附加一個on('error',fn)處理程序來捕獲錯誤(不僅僅是防止錯誤!)。 –

+0

@AlexMills這裏沒有真正的問題,沒有「?」 :)'錯誤'處理程序應該附加到衍生進程。 – gustavohenke

12

幾件事情:

  • dir是不是在Windows中的真正的可執行,因此node.js中找不到你想要運行的程序。
  • 您沒有將'error'處理程序綁定到您的子進程,並且該事件轉變爲使您的節點實例崩潰的異常。這樣做:
 
dir.on('error', function (err) { 
    console.log('dir error', err); 
}); 
  • 使用fs.readdir代替。這是一個標準的node.js API,可以做同樣的事情。
相關問題