Heroku上Node.js中的块式响应

时间:2019-01-14 18:35:53

标签: heroku heroku-nodejs

我有一些非常简单的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中,它不会以流式方式发出大块,而是最后将它们全部转储出去。

有人知道我可能做错了什么吗?

1 个答案:

答案 0 :(得分:1)

在注释部分之后-设置Transfer-Encoding: Chunked标头可以显式解决此问题。当您需要在Heroku中明确指定时,Digital Ocean可能会在分块方面做得很聪明。

有关标题的文档:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding

系统中可能发生此问题的另一个潜在问题:https://github.com/expressjs/compression/issues/56(如果您使用的是ExpressJS的旧版本-响应刷新包含错误)