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中SSL服务的性能
Jul 15 NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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-redis中文文档介绍
2013/02/07 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
讲解Python中if语句的嵌套用法
2015/05/14 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
django中media媒体路径设置的步骤
2019/11/15 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
计算s=f(f(-1.4))的值
2014/05/06 面试题
Linux文件操作命令都有哪些
2015/02/27 面试题
初中英语教学反思
2014/01/25 职场文书
药品营销策划方案
2014/06/15 职场文书
数学教育专业求职信
2014/07/22 职场文书
目标责任书格式范文
2015/05/11 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
关于mysql中string和number的转换问题
2022/06/14 MySQL
python读取mat文件生成h5文件的实现
2022/07/15 Python