Node.js - порождает процесс gzip - PullRequest
2 голосов
/ 30 июня 2011

Я пытаюсь сжать некоторые данные, используя Node.js ...

В частности, у меня есть данные в 'buf', и я хочу записать gzipped форму этого в 'stream'.

Вот мой код:

c1.on('data',function(buf){
                var gzip = spawn('gzip', ['-' + (compressionRate-0),'-c', '-']);

                gzip.stdin.write(buf);
                gzip.stdout.on('data',function(data){
                        console.log(data);
                        stream.write(data,'binary');
                });
});

Проблема в том, что он просто не будет работать!Я не уверен в точном синтаксисе процессов порождения и передачи данных в них.

Любая помощь очень ценится.

Заранее большое спасибо,

Редактировать: здесь естьоригинальный рабочий код, из которого я получил идею.Проект находится по адресу: https://github.com/indutny/node.gzip

Может кто-нибудь выяснить, как сделать это порождение в node.js, потому что я полностью застрял!


var spawn = require('child_process').spawn,
    Buffer = require('buffer').Buffer;

module.exports = function (data) {
    var rate = 8,
        enc = 'utf8',
        isBuffer = Buffer.isBuffer(data),
        args = Array.prototype.slice.call(arguments, 1),
        callback;

    if (!isBuffer && typeof args[0] === 'string') {
        enc = args.shift();
    }
    if (typeof args[0] === 'number') {
        rate = args.shift() - 0;
    }
    callback = args[0];

    var gzip = spawn('gzip', ['-' + (rate - 0), '-c', '-']);

    var promise = new
    process.EventEmitter,
        output = [],
        output_len = 0;

    // No need to use buffer if no
    callback was provided
    if (callback) {
        gzip.stdout.on('data', function (data) {
            output.push(data);
            output_len += data.length;
        });

        gzip.on('exit', function (code) {
            var buf = new Buffer(output_len);

            for (var a = 0, p = 0; p < output_len; p += output[a++].length) {
                output[a].copy(buf, p, 0);
            }
            callback(code, buf);
        });
    }
    // Promise events  
    gzip.stdout.on('data', function (data) {
        promise.emit('data', data);
    });
    gzip.on('exit', function (code) {
        promise.emit('end');
    });

    if (isBuffer) {
        gzip.stdin.encoding = 'binary';
        gzip.stdin.end(data.length ? data : '');
    } else {
        gzip.stdin.end(data ? data.toString() : '', enc);
    }

    // Return EventEmitter, so node.gzip can be used for streaming 
    // (thx @indexzero for that tip) 
    return promise;
};

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Почему бы вам просто не использовать библиотеку узлов gzip, которая вас вдохновляет, вместо копирования кода?

var gzip = require('gzip');
c1.on('data' function(buf){
    gzip(buf, function(err, data){
        stream.write(data, 'binary');
    }
}

Должно работать с использованием библиотеки. Чтобы установить его, просто наберите npm install gzip в своем терминале.

1 голос
/ 30 июня 2011

Вам нужно вызвать метод 'end' в gzip.stdin? I.e.:

gzip.stdin.write(buf);
gzip.stdout.on('data',function(data){
        console.log(data);
        stream.write(data,'binary');
});
gzip.stdin.end();           
...