Node.js child.spawn stdout живет в каждой строке

я пытаюсь использовать вывод Perl-скрипта в Node.js

for (my $i=10;$i<100 ;$i+=30 )
{
    printf "$i\n";
    sleep(1);
}

Этот скрипт вызывается методом child_process.spawn. Моя проблема в том, что мне нужно работать с каждым выходом. Есть ли способ запустить событие, как только perl отправит новую строку на стандартный вывод? В моем фактическом коде я вижу вывод как часть после завершения работы сценария perl, и невозможно работать с отдельными строками.

function setStuff() {
    var command = "perl";
    var scriptpath = "script.pl";
    var arg = [scriptpath];
    run(command, arg);
}
function run(cmd, arg) {
 var spawn = require('child_process').spawn;
    var command = spawn(cmd, arg, {detached: true, stdout: 'pipe'});

    command.unref();
    var lineBuffer = "";
    command.stdout.pipe(process.stdout);
    command.stdout.on('data', function (data) {
        lineBuffer += data.toString();
        var lines = lineBuffer.split("\n");
        for (var i = 0; i < lines.length - 1; i++) {
            var line = lines[i];
            console.log(line);
        }
    });
}

person DeZeT    schedule 12.02.2017    source источник


Ответы (1)


Поместите это в свой файл perl, чтобы отключить буферизацию на выходе:

select(STDOUT); $| =1;

Вам также необходимо исправить обработчик on 'data', чтобы вы не управляли переменным lineBuffer при использовании данных. Починить это :

command.stdout.on('data', function (data) {
    var lines = (lineBuffer + data).split("\n");
    if(data[data.length-1] != '\n') {
        lineBuffer = lines.pop();
    }else{
        lineBuffer = '';
    }
    for (var i = 0; i < lines.length - 1; i++) {
        var line = lines[i];
        console.log(line);
    }
});

Кроме того, отсутствует ли stdout.setEncoding('utf8'); ?

person Bulent Vural    schedule 12.02.2017
comment
Благодарю вас! Работает как надо! setEncoding затерялся, сделав код более удобным. На самом деле это было в исходном коде - person DeZeT; 13.02.2017