在流结束事件上通过管道推送对象(或“EOF之后的错误:stream.push()”)

时间:2016-02-18 11:54:05

标签: node.js

我有一个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中的项目刷新到管道中的下一个阶段?

1 个答案:

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