2013-07-19 41 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,可以做同样的事情。
相关问题