NodeJS: throw er;//Необработанное событие "error" (events.js: 72) при использовании метода порождения child_process
Я сделал приложение node.js
, чтобы перечислить все .txt
файлы из каталога рекурсивно и, для каждого из них, сделать некоторые вещи.
Здесь my 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)
Я использую node v0.10.13
в среде win32
.
Я делаю этот путь (spawn), потому что я хочу обрабатывать stdout
по строкам (метод exec выделяет целую stdout
как одну строку).
* ОБНОВЛЕНИЕ *
Кстати, использование spawn
для child_process
не гарантирует, что вывод для cmd dir
будет строковым. Я также создал вопрос для этого.
Ответы
Ответ 1
Это происходит потому, что dir
не является исполняемым в Windows. Это команда из оболочки.
Решение проблемы:
var dir = spawn('cmd', ['/c', 'dir']);
dir.stdout.on("data", function() {
// do things
})
Эта точная проблема была здесь.
Ответ 2
Несколько вещей:
-
dir
не является реальным исполняемым файлом в Windows, поэтому node.js не может найти программу, которую вы хотите запустить.
- Вы не привязывали обработчик
'error'
к вашему дочернему процессу, и это событие было превращено в исключение, разбившее ваш экземпляр node. Сделайте это:
dir.on('error', function (err) {
console.log('dir error', err);
});
- Вместо этого используйте fs.readdir. Это стандартный API node.js, который делает то же самое.