节点:在可写流中接收JSON

时间:2015-06-28 20:15:21

标签: node.js stream

我有一个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对象是否有某种限制,我无法管道它们?或者我只是做错了什么?

2 个答案:

答案 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();
    }
});