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
。
我这样做( 产卵 ),因为我想逐行处理stdout
( exec方法释放整个stdout
作为一个string)。
*更新*
顺便说一下,使用
spawn
为child_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,可以做同样的事情。