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写的一个简单项目打包工具
May 11 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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中使用xmlreader读取xml数据示例
2014/12/29 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
php常用的工具开发整理
2019/09/26 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
python多进程控制学习小结
2018/10/31 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
华为c/c++笔试题
2016/01/25 面试题
岗位职责范本
2013/11/23 职场文书
精神病医院见习报告
2014/11/03 职场文书
幼儿园辞职信
2015/05/13 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
自荐信大全
2019/03/21 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技