如何gZip通过管道readStream传递的内容

时间:2011-04-24 14:41:58

标签: node.js gzip piping

我目前正在开发一个项目,该项目要求在将内容发送回浏览器之前进行gZip-ed。

我目前正在使用简单的读取流并将数据传输到请求的响应,但我不确定在不阻止请求的情况下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 个答案:

答案 0 :(得分:1)

实际上,我有关于此事的博客文章。 http://dhruvbird.blogspot.com/2011/03/node-and-proxydecorator-pattern.html

您需要:

npm install compress -g

在使用它之前。

基本思想围绕使用管道添加功能。

然而,对于你的用例,你最好把node.js放在nginx后面去做所有的gzip,因为node.js是一个单独的进程(实际上不是),而gzip例程会占用你的进程'CPU。

答案 1 :(得分:0)

您可以通过压缩流管道:

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

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

假设文件尚未压缩,并且您已经为响应设置了所有标头。