http-сервер Node.JS со сжатием - отправка переменной в качестве ответа

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

Данные 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, как и ожидалось. Если я не отправляю серверу заголовок acccept-encoding, он отлично отправляет обычный текст, так что это должны быть функции сжатия.

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

Ваше здоровье


person whiteatom    schedule 01.04.2012    source источник
comment
Я предполагаю, что JSON предназначен для загрузки, иначе он, вероятно, задушит браузер :)   -  person Adam Gent    schedule 02.04.2012
comment
Нет, это данные о местоположении для картографического приложения в реальном времени. У большинства браузеров с этим проблем нет.   -  person whiteatom    schedule 30.05.2012


Ответы (1)


Решено....

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

person whiteatom    schedule 02.04.2012