Node.JS http сървър с компресия - изпращане на променлива като отговор

Съжалявам за неясния въпрос.. но не съм сигурен точно какъв е проблемът. Имам http сървър на възел, който използвам за обслужване на JSON данни към уеб приложение. Работи чудесно, но моите JSON низове започват да стават големи (10-12 MB), така че искам да добавя компресия с 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 използват потоци и функцията pipe, но аз не изпращам файл, тъй като генерирам 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