1

在 Meteor 中,在服务器端,我想在 Collection 上使用 .find() 函数,然后从返回的光标中获取 Node ReadStream 接口。我已经尝试在光标上使用 .stream() ,如 mongoDB 文档Seen Here中所述。但是我收到错误“对象[对象对象]没有方法'流'”所以看起来流星集合没有这个选项。有没有办法从 Meteor Collection 的光标中获取流?

我正在尝试将一些数据导出到 CSV,并且我想将数据直接从集合流传输到 CSV 解析器,然后再传输到返回给用户的响应中。我能够从我们正在使用的路由器包中获取响应流,除了从集合中获取流之外,它都可以正常工作。从 find 中获取数组以手动将其推送到流中会破坏流的目的,因为它将所有内容都放入内存中。我想我的另一个选择是在集合上使用 foreach 并将行一个一个地推送到流中,但是当我可以直接通过解析器对流进行管道转换时,这似乎很脏。

这是我正在尝试做的一些示例代码:

response.writeHead(200,{'content-type':'text/csv'});

// Set up a future
var fut = new Future();
var users = Users.find({}).stream();
CSV().from(users)
.to(response)
.on('end', function(count){
    log.verbose('finished csv export');
    response.end();
    fut.ret();
});
return fut.wait();
4

1 回答 1

0

您是否尝试过创建自定义函数并将其传递给它?

虽然这只有在Users.find()支持的情况下才有效.pipe()(同样,只有当 Users.find 继承自 node.js 流对象时)。

有一些像

var stream = require('stream')
var util = require('util')

streamreader = function (){
  stream.Writable.call(this)
  this.end = function() {
     console.log(this.data) //this.data contains raw data in a string so do what you need to to make it usable, i.e, do a split on ',' or something or whatever it is you need to make it usable
     db.close()
  })
}

util.inherits(streamreader,stream.Writeable)

stream.prototype._write = function (chunk, encoding, callback) {
  this.data = this.data + chunk.toString('utf8')
  callback()
}


Users.find({}).pipe(new streamReader())
于 2014-04-28T10:27:05.787 回答