2012-04-01 4 views
4

Извините за неопределенный вопрос .. но я не уверен, в чем проблема. У меня есть HTTP-сервер узлов, который я использую для передачи данных JSON в веб-приложение. Он отлично работает, но мои строки JSON начинают получать большие (10-12 МБ), поэтому я хочу добавить сжатие с помощью zlib.Node.JS http-сервер с сжатием - передающая переменная в качестве ответа

Данные JSON находятся в строковой переменной, и я хочу сжать, а затем записать объект ответа ... но результаты, которые возвращаются к клиенту, всегда имеют идеальные заголовки и контент. Вот моя deliverResponse функция:

var deliverResult = function (data, response, callback, acceptEncoding){ 
    var payload = callback + '(' + JSON.stringify(data) + ');'; 

    if (acceptEncoding.match(/\bdeflate\b/)) { 
     response.writeHead(200, { 'Content-Encoding': 'deflate', 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     zlib.deflate(payload, function(err, result){ 
      if(!err){ 
       //console.log(result.toString('utf8')); // I have data on the console here 
       response.write(result.toString('utf8')); // No data sent here 
      } 
     }); 
    } else if (acceptEncoding.match(/\bgzip\b/)) { 
     response.writeHead(200, { 'Content-Encoding': 'gzip', 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     zlib.gzip(payload, function(err, result){ 
      if(!err){ 
       response.write(result.toString('utf8')); 
      } 
     }); 
    } else { 
     writelog('INFO', 'Returning data without compression\n'); 
     response.writeHead(200, { 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     response.write(payload); 
    } 

    response.end(); 
} 

Примеры HTTP-сервер с потоками использования Zlib и функцией трубы, но я не посылаю файл, как я генерировать данные в формате JSON в приложении из базы данных, поэтому я основываясь на примерах удобства. До сих пор я обнаружил, что объект ответа хорош, и что result.toString ('utf8') выводит gobeldy-gook, как ожидалось. Если я не отправляю заголовок шифрования на сервер, он отлично передает текст, поэтому он должен быть функциями сжатия.

У кого-нибудь есть идеи? Я уверен, что это связано с моим недостатком понимания потоков, труб, буферов и объекта zlib, и это, вероятно, просто проблема синтаксиса, поэтому, надеюсь, кто-то, кто это понимает, может мне помочь :)

Приветствия

+0

Я предполагаю, что JSON загружен, иначе он, вероятно, choke the browser :) –

+0

Нет, это данные о местоположении для приложения отображения в реальном времени. У большинства браузеров нет проблем с этим. – whiteatom

ответ

2

решаемая ....

Stupid проблема .. response.write вызывается в функции асинхронной, так что это делает write.end() перед Response.Write и пустой ответ посылается ... заменил response.write на response.end в обратном вызове, и он отлично работает :)

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

  • Нет связанных вопросов^_^