我目前正在开发一个项目,该项目要求在将内容发送回浏览器之前进行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压缩。
由于
答案 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)
假设文件尚未压缩,并且您已经为响应设置了所有标头。