我有一个nodejs流管道,有点像这样:
source.pipe(bulkElasticSearchLookup).pipe(doWork).pipe(destination)
bulkElasticSearchLookup的目的是收集传入的对象,当它有10时,在Elasticsearch中为所有10个进行批量搜索,然后进行10个单独的this.push()调用以将项目放入doWork转换
这使我对Elasticsearch的调用次数减少了10倍,使我的管道速度提高了大约4倍。
以下是代码:
EsBulkLookup.prototype._transform = function (chunk, encoding, callback) {
var self = this;
self.queue.push(chunk);
if (self.queue.length === self.bulkSize) {
var lookups = self._doLookups();
self._pushAll(lookups);
self.queue = [];
}
callback()
};
EsBulkLookup.prototype._pushAll = function (items) {
var self = this;
items.forEach(function (item) {
self.push(item);
});
};
当流结束时,self.queue中可能会有一些项目,所以我想将这些项目刷新到管道中的下一步。
我试过了:
var self = this;
this.on('end', function () {
var lookups = self._doLookups();
self._pushAll(lookups);
});
这让我:
Error: stream.push() after EOF
如何在流结束时将我的Transform中的项目刷新到管道中的下一个阶段?
答案 0 :(得分:0)
我的问题文本中包含一条线索:" flush"。
来自https://nodejs.org/api/stream.html#stream_transform_flush_callback
transform._flush(回调)
回调函数当您完成刷新任何剩余数据时,调用此函数(可选择使用错误参数)。
EsBulkLookup.prototype._flush = function (callback) {
var lookups = this._doLookups();
this._pushAll(lookups);
};