我有一个MongoDB CursorStream,我想把它管道到我写的自定义WritableStream(TypeScript):
class NormalizerStream extends stream.Writable {
constructor(opts?: stream.WritableOptions) {
super(opts);
}
public _write(data: Buffer, encoding: string, callback: Function): void;
public _write(data: string, encoding: string, callback: Function): void;
public _write(data: any, encoding: string, callback: Function): void {
console.log(data);
callback();
}
}
我打开与数据库的连接并从集合中检索所有文档,我想将其传输到我的NormalizerStream中以规范化数据并将结果保存到另一个集合中。 所以我这样做(JavaScript):
Mongo.checkNative(function (db) {
db.collection('users').find({}).stream().pipe(new NormalizerStream());
});
但是在运行代码时,我总是会收到此错误:
TypeError: Invalid non-string/buffer chunk
JSON对象是否有某种限制,我无法管道它们?或者我只是做错了什么?
答案 0 :(得分:0)
答案是,我显然需要实现转换流,而不是可写流。我仍然不太确定为什么Writable Stream不接受JSON。
答案 1 :(得分:0)
我遇到了同样的问题,试图从postgres解析knex数据。在查看节点源之后,事实证明您必须使用objectMode:true和highWaterMark构造可写流。然后你的write方法将获得JSON块。否则你会看到上面的错误。
var writableStream = new stream.Writable(
{
objectMode : true,
highWaterMark : 16,
write : function(chunk, encoding, callback) {
console.log("write", chunk);
callback();
},
writev : function(chunk, callback) {
console.log("writeev", chunk);
callback();
}
});