Как gZip-контент, который передается через канал readStream - PullRequest
1 голос
/ 24 апреля 2011

В настоящее время я работаю над проектом, в котором требуется, чтобы содержимое было отредактировано перед отправкой обратно в браузер.

В настоящее время я использую простой поток чтения и передаю данные в ответ на запрос,но я не уверен, что лучший способ gZip-контента без блокировки запросов

Строка, которая отправляет данные:

require('fs').createReadStream(self.staticPath + Request.url).pipe(Response);

См. следующий класс - статический объект-обработчик:

(function(){

    var StaticFeeder = function()
    {
        this.staticPath = process.cwd() + '/application/static';
        this.contentTypes = require('./contenttypes')
    }

    StaticFeeder.prototype.handle = function(Request,Response,callback)
    {
        var self = this;
        if(Request.url == '/')
        {
            return false;
        }

        if(Request.url.indexOf('../') > -1)
        {
            return false;
        }

        require('path').exists(this.staticPath + Request.url,function(isthere){

            /*
             * If no file exists, pass back to the main handler and return
             * */
            if(isthere === false)
            {
                callback(false);
                return;
            }

            /*
             * Get the extention if possible
             * */
            var ext = require('path').extname(Request.url).replace('.','')

            /*
             * Get the Content-Type
             * */
            var ctype = self.contentTypes[ext] !== undefined ? self.contentTypes[ext] : 'application/octet-stream';

            /*
             * Send the Content-Type
             * */
            Response.setHeader('Content-Type',ctype);

            /*
             * Create a readable stream and send the file
             * */
            require('fs').createReadStream(self.staticPath + Request.url).pipe(Response);

            /*
             * Tell the main handler we have delt with the response
             * */
            callback(true);
        })
    }

    module.exports = new StaticFeeder();
})();

Может кто-нибудь помочь мне обойти эту проблему, я понятия не имею, как заставить трубопровод сжиматься с помощью gZip.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

На самом деле, у меня есть запись в блоге только об этой вещи. http://dhruvbird.blogspot.com/2011/03/node-and-proxydecorator-pattern.html

Вам понадобится:

npm install compress -g

Перед его использованием, хотя.

Основная идея вращается вокруг использования каналов для добавления функциональности.

Тем не менее, для вашего случая использования, вам было бы лучше поместить node.js позади nginx, чтобы выполнить все gzip'ing, так как node.js - это отдельный процесс (на самом деле это не так), а подпрограммы gzip заняли бы ваше ЦП процесса.

0 голосов
/ 21 марта 2013

Вы можете просто передать его через поток сжатия:

var fs = require('fs')
var zlib = require('zlib')

fs.createReadStream(file)
.pipe(zlib.createGzip())
.pipe(Response)

предполагает, что файл еще не сжат, и вы уже установили все заголовки для ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...