我想将非常大的压缩JSON字符串发送给客户端。
我尝试了koa和node文档中说明的许多方法,但是我无法满足于Koa对流式传输到其context.response.body
对象的期望。
我试过了
const buf = Buffer.from(json, 'utf-8');
zlib.gzip(buf, function (_, result) {
ctx.request.body = result;
});
基于此stackoverflow question.
也:
var input = new Buffer(json, 'utf8')
ctx.request.body = zlib.deflate(input)
以及
var input = new Buffer(json, 'utf8')
ctx.request.body = zlib.deflate(input).toString('utf8')
基于此stackoverflow question.
我也尝试使用存档器:
const archive = archiver.create('zip', {});
archive.pipe(ctx.body);
archive.append(JSON.stringify(json), { name: 'libraries.json'});
archive.finalize();
在大多数情况下,客户端会收到格式不正确的zip /文件,或者会将index.html作为文件接收。
我还尝试使用koa-compress,并使用this stackoverflow question作为指导。
app.use(compress({
filter: function (content_type: any) {
return /text/i.test(content_type);
},
threshold: 2048,
flush: require('zlib').Z_SYNC_FLUSH
}));
...
ctx.response.type = 'application/json';
ctx.body = json;
ctx.compress = true;
ctx.status = 200;
在这种情况下,客户端确实将json成功下载为.json,但是检查器中没有任何东西向我表明它实际上已压缩:
HTTP/1.1 200 OK
X-Powered-By: Express
vary: Accept-Encoding
last-modified: Thu, 01 Nov 2018 21:26:55 GMT
cache-control: max-age=0
content-type: application/json; charset=utf-8
content-length: 4767074
date: Tue, 11 Dec 2018 23:44:11 GMT
客户端正在尝试“创建Blob”技巧来下载文件:
const xhr = new XMLHttpRequest();
const default_headers = {
'Content-Type': 'application/json',
};
xhr.open('GET', `${API_URL}${url}`);
for (let header in default_headers) {
xhr.setRequestHeader(header, default_headers[header]);
}
xhr.onload = function() {
if (this.status === 200) {
// Create a new Blob object using the response data of the onload object
var blob = new Blob([this.response], { type: 'application/json' });
// Create a link element, hide it, direct it towards the blob, and then 'click' it programatically
let a = document.createElement('a');
a.style = 'display: none';
document.body.appendChild(a);
// Create a DOMString representing the blob and point the link element towards it
let url = window.URL.createObjectURL(blob);
a.href = url;
a.download = 'libraries.json';
// have also tried libraries.zip, .gzip, etc
// programatically click the link to trigger the download
a.click();
// release the reference to the file by revoking the Object URL
window.URL.revokeObjectURL(url);
}
};
xhr.responseType = 'blob';
xhr.send();
我还尝试过让客户端发出“香草”请求,而没有任何斑点技巧。然后,没有启动“文件下载”对话框。
我希望我在这方面对AJAX和文件下载有一个基本的误解。
如何允许浏览器客户端从运行Koa的节点服务器请求然后下载(很大)压缩的JSON?
最佳答案
懒惰的方法是让其他人为您完成工作:
https://www.npmjs.com/package/koa-compress
https://github.com/koajs/compress
如此简单:
const responseBodyCompressor = require("koa-compress");
...
app.use( responseBodyCompressor() )
...
关于javascript - 如何从运行Koa的Node发送压缩字符串到客户端?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53733852/