目前我正在实现一个带有CSV文件流的管道,以便将其行写入具有特定模型的数据库 . 我开始将所有内容写入stdout . 当我附加自定义(转换)产品 Map 流时,这会让意外行为迅速发生 .

起初我开始只使用fs readstream,将其传送到csv转换器(基于npm包csv-streamify)并写入process.stdout . 一切都像平常一样流淌 .

但后来我连接了我的自定义变压器,它开始变得怪异 . 因为只要我将任何操作(JSON.parse,typeof chunk)应用到转换中的块中,数据就不会直接流到stdout,而是看起来只有在读取流完成时才会出现 .

有人知道为什么会这样吗?

我的管道:

const filePath = path.join(__dirname, 'file1.csv');

//From NPM module: csv-streamify
const csvTransformer = csv({objectMode: false, columns: true});
const mapper = new CsvMapper();
const productMapStream = ProductMapStream.create(mapper);
const writeStream = ProductWriteStream.create(this.connectionPool);

  fs.createReadStream(filePath)
    .pipe(csvTransformer)
    .pipe(csvProductMapStream)
    .pipe(process.stdout)
    .on('finish', () => resolve('Ok'))

我的自定义转换流:

export class ProductMapStream {

  static create(mapper: ProductMappable) {
    return new Transform({
      transform(chunk: any, enc, callback) {
        try {
          const chunkAsString = chunk.toString('utf8');
          // This already prevents continuous flowing
          const newString = '' + (typeof chunkAsString);
          this.push(newString);
          callback(null);
        } catch (e) {
          callback(e);
        }
      }
    }).once('error', console.log)
  }
}

EDIT:

经过一些基于@PatrickDillon注释的实验,我发现只有当它在Docker容器内运行时才会出现这个问题 . 我已经尝试了基于Docker节点映像的不同节点版本 . 我从节点开始:8.12.0-alpine,我也尝试了节点:10.11.0-jessie,但不幸的是没有行为上的差异 . 有没有人知道在使用带有fs或流的Docker或可能看似相关的任何东西时的特殊行为?