Nodejs发送部分响应

Roh*_*hit 5 csv node.js export-to-csv

mongodb集合中有20,000条记录.我在csv中导出所有这些记录.我使用这个发送部分响应:

res.writeHead(200, {
                     "Content-Type": "application/csv",
                     "Content-disposition": "attachment; filename='import.csv'"
 });

res.write(data + '0', "binary");
Run Code Online (Sandbox Code Playgroud)

上面的代码以500的批量执行.我在处理所有记录时使用此代码结束.

if (++responseCount == loopCount) {
  res.end();
}
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误:

发送后无法设置标头.

但我得到的文件下载了500条记录.

这是我的完整代码.

var exportData = function (req, res, next) {

var limit = 500;
var responseCount = 0;
var loopCount = 1;
var size = 30000;

//Get 500 records at one time
var getData = function (req, start, cb) {
    req.db.collection('items').find().skip(start).limit(limit).toArray(function (err, records) {
        if (err) throw err;
        cb(null, records);
    });
};

if (size > limit) {
    loopCount = parseInt(req.size / limit);

    if ((req.size % limit) != 0) {
        loopCount += 1;
    }
}

for (var j = 0; j < loopCount; j++) {

    getData(req, limit * j, function (err, records) {

        if (err) throw err;

        records.forEach(function (record) {
            //Process record one by one
        });

        res.write(records);

        if (++responseCount == loopCount) {
            res.setHeader('Content-type', 'application/csv');
            res.setHeader("Content-disposition", 'attachment; filename="import.csv"');
            res.end();

        }

    });
}
};
Run Code Online (Sandbox Code Playgroud)

RIY*_*HAN 1

这个说法

res.writeHead(200, {
                     "Content-Type": "application/csv",
                     "Content-disposition": "attachment; filename='import.csv'"
 });
Run Code Online (Sandbox Code Playgroud)

当您响应发送时属于标头部分。因此,它发送标头。
res.end()也发送标头。因此,通过这种方式您再次发送标头。

请参考这个stackoverlflow 问题


编辑代码:

data.pipe(resp);
resp.end();
Run Code Online (Sandbox Code Playgroud)

更多管道请参考此