我尝试编写一个转换流,该流将用作从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()
做我期待它做的事情?我必须有一些简单的东西。
答案 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))
}
}