来自 Mongoose 的流数据 - "Can't set headers after they are sent"
Streaming data from Mongoose - "Can't set headers after they are sent"
我有一个使用 Node、Express、Angular 和 Mongoose 的应用程序。我正在尝试从 MongoDB 中获取一个非常大的数据集,所以我正在尝试流式传输它。它加载了第一块数据,但随后出现错误:错误:发送后无法设置 headers。下面是我的代码。
routes.js
module.exports = function(app) {
var Org = require('./models/org');
var JSONStream = require('JSONStream');
var stringify = require('stringify');
app.get('/api/orgs', function(req, res){
res.set('Content-Type', 'application/json');
Org.find().stream().pipe(JSONStream.stringify()).pipe(res);
console.log('STATUS: ' + res.statusCode);
})
};
models/org.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('Org', new Schema({
ein : {type : Number},
}), 'irs9902013');
使用流式接口,data
事件针对查询结果中的每个文档发出。这导致 res.json(data)
被多次调用,这是一个错误,因为 res.json
内部调用 res.send
试图在 Content-Type
header 上设置字符集。由于第一个文档已经写入响应 body,因此无法在此之后设置 header。
您可以使用 JSONStream
直接将查询结果通过管道传递给响应:
res.set('Content-Type', 'application/json');
Model.find().stream().pipe(JSONStream.stringify()).pipe(res);
一种天真的方法是积累来自 data
事件的文档并等待 end
事件调用 res.json(accumulatedDocuments)
,但这违背了流式传输的目的并且可以直接使用
完成
Model.find().toArray(function (err, results) {
res.json(results);
});
我有一个使用 Node、Express、Angular 和 Mongoose 的应用程序。我正在尝试从 MongoDB 中获取一个非常大的数据集,所以我正在尝试流式传输它。它加载了第一块数据,但随后出现错误:错误:发送后无法设置 headers。下面是我的代码。
routes.js
module.exports = function(app) {
var Org = require('./models/org');
var JSONStream = require('JSONStream');
var stringify = require('stringify');
app.get('/api/orgs', function(req, res){
res.set('Content-Type', 'application/json');
Org.find().stream().pipe(JSONStream.stringify()).pipe(res);
console.log('STATUS: ' + res.statusCode);
})
};
models/org.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('Org', new Schema({
ein : {type : Number},
}), 'irs9902013');
使用流式接口,data
事件针对查询结果中的每个文档发出。这导致 res.json(data)
被多次调用,这是一个错误,因为 res.json
内部调用 res.send
试图在 Content-Type
header 上设置字符集。由于第一个文档已经写入响应 body,因此无法在此之后设置 header。
您可以使用 JSONStream
直接将查询结果通过管道传递给响应:
res.set('Content-Type', 'application/json');
Model.find().stream().pipe(JSONStream.stringify()).pipe(res);
一种天真的方法是积累来自 data
事件的文档并等待 end
事件调用 res.json(accumulatedDocuments)
,但这违背了流式传输的目的并且可以直接使用
Model.find().toArray(function (err, results) {
res.json(results);
});