具有压缩的Node.JS http服务器 - 将变量作为响应发送

时间:2012-04-01 23:25:59

标签: javascript node.js zlib http-compression

对于模糊的问题感到抱歉..但我不确定问题是什么。 我有一个节点http服务器,我用它来向Web应用程序提供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();
}

使用zlib的http服务器示例使用流和管道函数,但是我没有发送文件,因为我在应用程序中从数据库生成JSON数据,所以我基于方便方法示例。到目前为止我的故障排除我知道响应对象是好的,而result.toString('utf8')按预期输出gobeldy-gook。如果我不向服务器发送acccept-encoding标头,它会完美地发送纯文本 - 所以它必须是压缩函数。

有人对此有任何想法吗?我非常肯定我必须对流,管道,缓冲区和zlib对象缺乏了解,这可能只是一个语法问题,所以希望了解这一切的人可以帮助我:)

干杯

1 个答案:

答案 0 :(得分:2)

...解决

愚蠢的问题..在异步函数中调用response.write,因此它在response.write之前执行write.end()并发送空响应...将response.write替换为response。在回调中结束并且它完美地工作:)