错误:EOF之后的stream.push()

时间:2018-02-24 23:57:09

标签: node.js stream

使用节点流

此代码从index.js读取并写入indexCopy.js - 一种文件副本。 目标文件已创建,但在执行期间抛出异常:

node index.js
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: stream.push() after EOF
    at readableAddChunk (_stream_readable.js:240:30)
    at MyStream.Readable.push (_stream_readable.js:208:10)
    at ReadStream.f.on (C:\Node\index.js:16:28)
    at emitOne (events.js:116:13)
    at ReadStream.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    at ReadStream.Readable.push (_stream_readable.js:208:10)
    at fs.read (fs.js:2042:12)
    at FSReqWrap.wrapper [as oncomplete] (fs.js:658:17)

C:\Node>

这是代码:

var util = require('util');
var stream = require('stream');
var fs = require('fs');


var MyStream = function(){
    stream.Readable.call(this)
}

util.inherits(MyStream,stream.Readable);


MyStream.prototype._read = function(d){

    f = fs.createReadStream("index.js");
    f.on('data',(d)=>{this.push(d)});
    f.on('end',()=>{this.push(null)}); //when file finished need to close stream

}


var f = fs.createWriteStream("indexCopy.js")

var myStream = new MyStream()
myStream.pipe(f);

我试图在'数据'中调用this.push(null)。事件,在这种情况下,甚至没有创建目标文件,代码也会失败,但例外情况。

我意识到使用pipe()函数可以更轻松地复制文件 - 我只是在试验/学习。 我的方法出了什么问题?

1 个答案:

答案 0 :(得分:2)

您不希望f = fs.createReadStream("index.js")方法中的_read行重复调用 - _read,因此您要创建多个读取流。把它放在你的构造函数中。

function MyStream () {
    stream.Readable.call(this);
    this.source = fs.createReadStream("index.js");
    this.haveBound = false;
}
MyStream.prototype._read = function () {
    if (this.haveBound) return; // Don't bind to events repeatedly
    this.haveBound = true;
    this.source.on("data", d => this.push(d));
    this.source.on("end", () => this.push(null));
};

但这很尴尬。流意味着pipe'ed。