Nodejs关于gzip/deflate压缩详解


Posted in NodeJs onMarch 04, 2015

0x01.关于

写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。

关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。

0x02.管道压缩

Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。

当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。

NodeJS中通过各种Stream来提供对数据流的操作。

官网提供了管道方法:

// client request example

var zlib = require('zlib');

var http = require('http');

var fs = require('fs');

var request = http.get({ host: 'homeway.me',

                     path: '/',

                     port: 80,

                     headers: { 'accept-encoding': 'gzip,deflate' } });

request.on('response', function(response) {

    var output = fs.createWriteStream('izs.me_index.html');

    switch (response.headers['content-encoding']) {

        // or, just use zlib.createUnzip() to handle both cases

        case 'gzip':

            response.pipe(zlib.createGunzip()).pipe(output);

            break;

        case 'deflate':

            response.pipe(zlib.createInflate()).pipe(output);

            break;

        default:

            response.pipe(output);

            break;

    }

});

0x03.非管道压缩

代码如下:

#! /usr/local/bin/node

var http = require('http'),

    querystring = require('querystring'),

    zlib = require('zlib');

var args = {

    //参数以及备用数据

    contents : querystring.stringify({  

        //发包的信息

        name:'homeway.me',

    }), 

};

var options = {

    hostname: 'homeway.me',

    port: 80,

    path: '/',

    method: 'GET',

    headers: {

        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

        'Content-Length': args.contents.length,

        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.11 Safari/537.36',

        'Accept-Encoding':'gzip, deflate',

   },

};

var get = function ( options, args, callback ){

    var req = http.request(options, function (res) {

        var chunks =[], data, encoding = res.headers['content-encoding'];

        // 非gzip/deflate要转成utf-8格式

        if( encoding === 'undefined'){

            res.setEncoding('utf-8'); 

        }

        res.on('data', function (chunk){

            chunks.push(chunk);

        }); 

        res.on('end', function (){

            var buffer = Buffer.concat(chunks);

            if (encoding == 'gzip') {

                zlib.gunzip(buffer, function (err, decoded) {

                    data = decoded.toString();

                    callback( err, args, res.headers, data); 

                });

            } else if (encoding == 'deflate') {

                zlib.inflate(buffer, function (err, decoded) {

                    data = decoded.toString();

                    callback( err, args, res.headers, data); 

                });

            } else {

                data = buffer.toString();

                callback( null, args, res.headers, data);

            } 

        });

    });

    req.write( args.contents ); 

    req.end();

};

get( options, args, function (err, args, headers, data){

    console.log('==>header \n', headers);

    console.log('==data \n', data);

});

以上就是Nodejs关于gzip/deflate压缩的全部内容了,希望大家能够喜欢。

NodeJs 相关文章推荐
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
nodejs开发微博实例
Mar 25 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 NodeJs
浅谈Node的内存泄露问题
May 06 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 #NodeJs
Windows系统中安装nodejs图文教程
Feb 28 #NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 #NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 #NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 #NodeJs
NodeJs基本语法和类型
Feb 13 #NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 #NodeJs
You might like
PHP学习笔记之一
2011/01/17 PHP
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
Python中的startswith和endswith函数使用实例
2014/08/25 Python
Python模块搜索路径代码详解
2018/01/29 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
Mac安装python3的方法步骤
2019/08/09 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
python中wx模块的具体使用方法
2020/05/15 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
决心书标准格式
2014/03/11 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
劳模先进事迹材料
2014/12/24 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL