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 相关文章推荐
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
nodejs下打包模块archiver详解
Dec 03 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
PHP类中Static方法效率测试代码
2010/10/17 PHP
php文件操作实例代码
2012/05/10 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
简单JS代码压缩器
2006/10/12 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
如何查找网页漏洞
2016/06/22 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
酒店副总岗位职责
2013/12/24 职场文书
运输服务质量承诺书
2014/03/27 职场文书
授权委托书格式
2014/07/31 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
党纪处分决定书
2015/06/24 职场文书
php 原生分页
2021/04/01 PHP
Java设计模式中的命令模式
2022/04/28 Java/Android