【发布时间】:2015-10-01 10:18:42
【问题描述】:
我需要从 nodejs 发送部分响应,但此代码不起作用。 它会立即从数据库中获取 500 条记录,然后逐条处理每条记录。我想从 node.js 发送部分响应。如果我将数据存储在数组中,则会发生缓冲区溢出错误。
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();
}
});
}
};
【问题讨论】:
-
也许你应该在调用
res.write之前设置标题? -
我也试过这个东西,但没用
-
您应该尝试流式传输响应。除非您需要以 X 组的形式将请求批量处理,否则您可以使用
through/through2轻松地将 mongoose 中的每个项目通过处理逻辑管道传输到响应。 -
您能否编辑代码以使用流式传输?
-
我会试一试,但它仍然需要你自己修改,可能因为我没有在本地测试这个
标签: node.js