如何重置nodejs流?

How to reset nodejs stream?

如何重置nodejs流? 如何在nodejs中再次读取流? 提前致谢!

var fs = require('fs');
var lineReader = require('line-reader');

// proxy.txt = only 3 lines

var readStream = fs.createReadStream('proxy.txt');
lineReader.open(readStream, function (err, reader) {
    for(var i=0; i<6; i++) {
        reader.nextLine(function(err, line) {
            if(err) {
                readStream.reset(); // ???
            } else {
                console.log(line);
            }
        });
    }
});

有两种方法可以解决您的问题,正如之前有人评论的那样,您可以简单地将所有内容包装在一个函数中,而不是重新设置 - 只需再次读取文件。

Ofc 这不适用于 HTTP 请求,所以反过来说,如果您确实考虑了更大的内存使用量,您可以简单地累积数据。

你需要的是实现某种 "rewindable stream" - 这意味着你本质上需要实现一个转换流,它会保留所有缓冲区的列表并将它们写入管道以倒带方式流式传输。

看看这里的node API for streams,方法应该有点像这样。

class Rewindable extends Transform {

  constructor() {
    super();
    this.accumulator = [];
  }

  _transform(buf, enc, cb) { 
    this.accumulator.push(buf);
    callback()
  }

  rewind() {
    var stream = new PassThrough();
    this.accumulator.forEach((chunk) => stream.write(chunk))
    return stream;
  }

你会像这样使用它:

var readStream = fs.createReadStream('proxy.txt');
var rewindableStream = readStream.pipe(new Rewindable());

(...).on("whenerver-you-want-to-reset", () => {
    var rewound = rewindablesteram.rewind();
    /// and do whatever you like with your stream.
});

实际上我想我会把它添加到我的 scramjet 中。 :)

编辑

我在 rereadable-stream npm 包中发布了以下逻辑。此处描述的流的结果是您现在可以控制缓冲区长度并摆脱读取数据。

同时您可以保留 window 个 count 项并向后拖尾一些块。