Подтвердить что ты не робот

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 будет строковым. Я также создал вопрос для этого.

4b9b3361

Ответ 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, который делает то же самое.