来自 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);
});