Heroku 上 Node.js 中的分块响应
Chunked response in Node.js on Heroku
我有一些非常简单的 Node.js 代码,我想将其作为分块响应发出。代码是:
const WAIT = 500;
const records = [...];
function getList(req, res, url) {
var list = records.slice().map(rec => JSON.stringify(rec) + "\n");
var len = list.reduce((size, cur) => { size += Buffer.byteLength(cur); return size; }, 0);
function next() {
var cur = list.shift();
if(!cur) {
res.end();
return;
}
res.write(cur);
setTimeout(next, WAIT);
}
res.writeHead(200, {
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/x-ndjson",
"Content-Length": len.toString(),
"X-Accel-Buffering": "no"
});
setTimeout(next, WAIT);
}
const PORT = process.env.PORT || 8080;
require("http").createServer(getList).listen(PORT);
这应该将此数据写为 ndjson 块,直到数组被清空。
本地和通用 VPS 这按预期工作。在 Heroku 上,它不会以流方式发出块,而是在最后将它们全部转储出来。
有人知道我可能做错了什么吗?
评论区后-设置Transfer-Encoding: Chunked
header明确解决了这个问题。当您需要在 Heroku 中明确指定时,Digital Ocean 可能会通过分块做一些聪明的事情。
关于 header 的文档:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding
为什么您的系统中会出现这种情况的另一个潜在问题:https://github.com/expressjs/compression/issues/56(如果您使用的是旧版本的 expressjs - 响应刷新包含一个错误)
我有一些非常简单的 Node.js 代码,我想将其作为分块响应发出。代码是:
const WAIT = 500;
const records = [...];
function getList(req, res, url) {
var list = records.slice().map(rec => JSON.stringify(rec) + "\n");
var len = list.reduce((size, cur) => { size += Buffer.byteLength(cur); return size; }, 0);
function next() {
var cur = list.shift();
if(!cur) {
res.end();
return;
}
res.write(cur);
setTimeout(next, WAIT);
}
res.writeHead(200, {
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/x-ndjson",
"Content-Length": len.toString(),
"X-Accel-Buffering": "no"
});
setTimeout(next, WAIT);
}
const PORT = process.env.PORT || 8080;
require("http").createServer(getList).listen(PORT);
这应该将此数据写为 ndjson 块,直到数组被清空。
本地和通用 VPS 这按预期工作。在 Heroku 上,它不会以流方式发出块,而是在最后将它们全部转储出来。
有人知道我可能做错了什么吗?
评论区后-设置Transfer-Encoding: Chunked
header明确解决了这个问题。当您需要在 Heroku 中明确指定时,Digital Ocean 可能会通过分块做一些聪明的事情。
关于 header 的文档:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding
为什么您的系统中会出现这种情况的另一个潜在问题:https://github.com/expressjs/compression/issues/56(如果您使用的是旧版本的 expressjs - 响应刷新包含一个错误)