在Meteor中,在服务器端,我想在Collection上使用.find()函数,然后从返回的光标中获取Node ReadStream接口。我已经尝试使用.stream()在光标上,如mongoDB文档中所述。然而,我得到的错误"对象[对象对象]没有方法'流'",所以它看起来像流星集合没有这个选项。有没有办法从流星集合的光标中获得流?
我试图导出一些数据到CSV,我想管道数据直接从集合流到CSV解析器,然后进入响应返回给用户。我能够从我们正在使用的Router包中获取响应流,除了从集合中获取流之外,它都在工作。手动从查找中获取数组并将其推入流将破坏流的目的,因为它会将所有内容放入内存中。我想我的另一个选择是在集合上使用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();
您是否尝试过创建一个自定义函数并管道到它?
虽然这只在Users.find()
支持.pipe()
的情况下才有效(同样,只在Users。查找继承自node.js的streamble对象
有点像
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())