NodeJS:扔呃; //使用child_process spawn方法时,未处理的“错误”事件(events.js:72)

我已经做了一个node.js应用程序来recursion列出目录中的所有.txt文件,并为每个文件做一些东西。

这是我的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) 

我在win32环境下使用节点v0.10.13

我这样做( 产卵 ),因为我想逐行处理stdoutexec方法释放整个stdout作为一个string)。

*更新*

顺便说一下,使用spawnchild_process不保证cmd dir的输出将逐行。 我也为此提出了一个问题 。

发生这种情况是因为dir在Windows中不是可执行文件。 这是一个来自shell的命令。
您的问题的解决scheme如下:

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

这确切的问题也在这里 。

几件事情:

  • dir是不是在Windows中的真正的可执行文件,所以node.js找不到你想运行的程序。
  • 您没有将'error'处理程序绑定到您的subprocess,并且该事件变成了使您的节点实例崩溃的exception。 做这个:
 dir.on('error',function(err){
   console.log('dir error',err);
 });
  • 改用fs.readdir 。 这是一个标准的node.js API,可以做同样的事情。