2013-02-22 3 views
2

Я видел пример, показанный hereNode.js выкачать/GZIP текст ответа

response.writeHead(200, { 'content-encoding': 'deflate' }); 
raw.pipe(zlib.createDeflate()).pipe(response); 

Я попытался отправить ответ, создавая поток для чтения и отправки спущенном выход.

Но я ищу способ сделать это без чтения потока, потому что текст, который у меня есть, приходит из другого запроса HTTP. Я просто использовал для response.write(text);

Я попробовал несколько вещей, в том числе

zlib.deflate(text, function (err, buffer) { 
    if (err) throw err; 
    response.write(buffer); 
    response.end(); 
}); 

Но браузер говорит invalid or unsupported form of compression.

Что я делаю неправильно?

connect «s код говорит

return stream 
    ? stream.write(new Buffer(chunk, encoding)) 
    : write.call(res, chunk, encoding); 

Так это, как только потоки будут обрабатываться?

ответ

2

Вы используете Экспресс? Если это так, просто используйте compress промежуточное программное обеспечение:

app.use(express.compress()); 

http://expressjs.com/api.html#compress

+0

Нет, я использую 'connect' и пытаюсь сжать функцию' router'. Любая другая идея? –

+0

'connect.compress()'? – robertklep

+0

с помощью 'connect.compress' У меня такая же проблема, с которой он сталкивается http://stackoverflow.com/questions/13163393/my-returned-data-is-not-gzipped-with-connect-compress –

0

Таким образом, мне удалось решить эту проблему. Вот код

var zlib = require('zlib'); 
var connect = require('connect'); 
var fs = require('fs'); 

var server = connect() 
    // .use(connect.compress()) It didn't work either 
    .use(function (req, res, next) { 
     var text = fs.readFileSync('test.js'); 

     zlib.deflate(text, function (err, buffer) { 
      if (err) throw err; 

      res.writeHead(200, { 
       'Content-Encoding': 'deflate', 
       'Content-Type': 'text/javascript' 
      }); 

      res.end(buffer); 
     }); 
    }) 
    .listen(1337); 

Я не знаю, какую ошибку я сделал раньше, что заставило его не работать. Я не уверен, что конфликт какой-либо версии вызывал проблему или что-то еще. но, наконец, приведенный выше код работает для меня;)

+0

Это ужасное решение, потому что вы храните весь файл в памяти –

+0

Ну, я знаю и делал это только для некоторых целей тестирования. Однако попросите вас опубликовать любое лучшее решение, если у вас есть, поэтому другие могут получить выгоду от передовой практики. Благодарю. –

+0

'res.writeHead(); fs.createFileStream (файл) .pipe (zlib.createGzip()). pipe (res)); ' –

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