节点转换流不将输出发送到管道?

时间:2018-02-16 21:59:26

标签: node.js stream

我正在做什么

我尝试编写一个转换流,该流将用作从HTTP API(Salesforce)读取数据的流程的一部分,将每个资源转换为标准内部数据结构,然后发送转换后的数据由Elasticsearch索引。

我的问题

我已经编写了一个简单的转换流,但它似乎是在吞咽数据,而不是通过它。

这是我的班级AdapterStream

const { Transform } = require('stream')

class AdapterStream extends Transform {
  constructor (adapter) {
    super({objectMode: true})
    // adapter is a function that contains the transform logic
    this.adapter = adapter
  }

  _transform (chunk, _encoding, callback) {
    this.push(this.adapter(chunk))
    callback()
  }
}

module.exports = AdapterStream

以下是我如何使用

// query is an EventEmitter (https://jsforce.github.io/document/#query)
query.run({autoFetch: true, maxFetch: 10})
     .pipe(transform)
     .pipe(process.stdout)

我期待发生什么

我希望在终端窗口中看到转换后的数据。

实际发生的事情

我的终端窗口中没有打印任何内容

我试过的事情

写入文件

query.run({autoFetch: true, maxFetch: 10})
     .pipe(transform)
     .pipe(fs.createWriteStream('./test.json'))

这会按预期创建文件./test.json,但它是空的。

订阅活动

query.run({autoFetch: true, maxFetch: 10})
     .pipe(transform)

transform.on('readable', () => { console.log(transform.read()) })

这符合我的预期.pipe(process.stdout):将转换的记录打印到控制台。

我的问题是,为什么不pipe()做我期待它做的事情?我必须有一些简单的东西。

1 个答案:

答案 0 :(得分:0)

您想将数据作为第二个参数返回给回调。如下所示。

const { Transform } = require('stream')

class AdapterStream extends Transform {
  constructor (adapter) {
    super({objectMode: true})
    // adapter is a function that contains the transform logic
    this.adapter = adapter
  }

  transform (chunk, _encoding, callback) {
    callback(null, this.adapter(chunk))
  }
}