带有压缩的Node.JS http服务器 – 发送variables作为响应

对不起模糊的问题..但我不确定问题是什么。 我有一个节点http服务器,我正在使用JSON数据提供给一个Web应用程序。 它工作的很好,但我的JSONstring开始变大(10-12 MB),所以我想用zlib添加压缩。

JSON数据是在一个stringvariables,我想压缩,然后写入响应对象…但返回到客户端的结果似乎总是有完美的标题,没有内容。 这是我的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使用stream和pipe道function,但我没有发送文件,因为我从数据库中生成应用程序的JSON数据,所以我基于这个方便的方法的例子。 我到目前为止的故障排除我知道响应对象是好的,并result.toString('utf8')输出gobeldy-gook按预期。 如果我不向服务器发送一个acccept-encoding头文件,它将完美地发送纯文本 – 所以它必须是压缩函数。

任何人有任何想法呢? 我很确定它必须与我对stream,pipe道,缓冲区和zlib对象缺乏了解,这可能只是一个语法问题,所以希望有人了解这一切可以帮助我:)

干杯

解决了….

愚蠢的问题..在asynchronous函数中调用response.write,所以它在执行response.write之前执行write.end(),并发送一个空的响应…将response.writereplace为response.endcallback,它完美的作品:)