whi*_*tom 5 javascript zlib http-compression node.js
抱歉这个含糊不清的问题......但我不太确定问题是什么。我有一个节点 http 服务器,用于将 JSON 数据提供给 Web 应用程序。它工作得很好,但我的 JSON 字符串开始变大(10-12 MB),所以我想用 zlib 添加压缩。
JSON 数据在一个字符串变量中,我想压缩然后写入响应对象......但返回到客户端的结果似乎总是具有完美的标头,并且没有内容。这是我的 deliveryResponse 函数:
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();
}
Run Code Online (Sandbox Code Playgroud)
带有 zlib 的 http 服务器示例使用流和管道函数,但是当我从数据库生成应用程序中的 JSON 数据时,我没有发送文件,因此我将其基于便捷方法示例。到目前为止,我的故障排除我知道响应对象很好,并且 result.toString('utf8') 按预期输出 gobeldy-gook。如果我不向服务器发送接受编码标头,它会完美地发送纯文本 - 所以它必须是压缩功能。
有人对此有任何想法吗?我很确定这与我对流、管道、缓冲区和 zlib 对象缺乏了解有关,这可能只是一个语法问题,所以希望了解所有这些的人可以帮助我:)
干杯
解决了....
愚蠢的问题..在异步函数中调用response.write,因此它在response.write之前执行write.end()并发送空响应...将response.write替换为response.end回调并且完美运行:)
| 归档时间: |
|
| 查看次数: |
2930 次 |
| 最近记录: |