2012-02-27 2 views
2

Я хочу, чтобы файл gzip хранил его в памяти, и всякий раз, когда запрос поступает от клиента, я хочу вывести данные gzipped. Однако я получаю сообщение об ошибке 330 в моем браузере (я использую самую последнюю версию хром)Ошибка 330, когда Gzipping ответ от сервера nodejs

Код ниже выглядит прямо ко мне, есть ли что-то еще, что мне не хватает?

var http = require('http'); 
var url = require('url'); 
var fs = require('fs'); 
var zlib = require('zlib'); 
var gzippedData = ''; 

//read file into memory 
fs.readFile('layout.html', function(err, data){ 
    if(err) throw err; 
    zlib.gzip(data, function(err, buffer) { 
    if (err) throw err; 
    gzippedData = buffer.toString('binary');   
    }); 
}); 


var server = http.createServer(function(req, res){ 
    var path = url.parse(req.url).pathname; 
    switch (path){ 
    case '/': 
     res.writeHead(200, {'content-encoding': 'gzip'}); 
     res.write(gzippedData); 
     res.end(); 
    break; 
    default: 
     res.writeHead(404); 
     res.write('404'); 
     res.end(); 
}}); 

server.listen(8080); 

ответ

0

Изменить

gzippedData = buffer.toString('binary');   

в

gzippedData = buffer; 

И вы должны быть хорошо идти!

EDIT: Это происходит потому, что res.write будет кодировать ответ как utf8 по умолчанию. Вместо этого вы можете изменить это на res.write(gzippedData, 'binary'), но это не нужно. Дешевле просто сохранить ссылку на буфер вместо выделения строки js и кодировки, которая еще раз.

+0

Это работает !! приветственный помощник! Действительно ли дешевле хранить ссылку на буфер, чем хранить данные в памяти: Если вы указали ссылку на буфер, это означало бы, что все миллионы запросов (например) на сервер, данные из файла Я думал, что было бы дешевле, если данные уже хранятся в памяти, так что вы делаете это вымывание ... – chris

+0

Повторите пример примера с 1 миллионом, если я держал ссылку на буфер будет означать, что все 1 миллион запросов потребуют также gzip миллион раз? конечно, это должно быть дороже, чем, читая один раз, gzippping и удерживая его в памяти за все 1 миллион запросов ?. – chris

+0

Думаю, вы меня неправильно поняли. Файл будет загружен один раз независимо. Единственное отличие состоит в том, что если вы дадите 'gzippedData = buffer', вы просто сохраните единственную ссылку на этот буфер. Если вы 'gzippedData = buffer.toString ('binary')', вам нужно выделить эту память для строки javascript, а _then_ вам нужно закодировать это как 'binary' для каждого запроса. Я призываю вас не смириться с этим, но вместо этого сделайте бенчмарк. Вы можете записывать 'process.memoryUsage()' между запросами (или даже в свой собственный обработчик запросов). Пойдите 'ab' на это! –

Смежные вопросы