目前,我正在实现一个带有CSV文件流的管道,以将其行写入具有特定模型的db中。我开始将所有内容都写到stdout。当我附加我的自定义(转换)产品地图流时,这很快就会导致意外行为。
首先,我仅使用fs readstream开始,将其通过管道传输到csv转换器(基于npm包csv-streamify)并写入process.stdout。一切都像往常一样流动。
但是后来我连接了我的自定义变压器,它开始表现得很奇怪。因为一旦将任何操作(JSON.parse,typeof块)应用到转换中的块中,数据就不会直接流到stdout,而是看起来只有在完成读流时才会流到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)
}
}
编辑:
基于@PatrickDillon的评论进行了一些实验之后,我发现仅当它在Docker容器中运行时才会出现此问题。我已经尝试过基于Docker节点映像的不同节点版本。我从node:8.12.0-alpine开始,我也尝试了node:10.11.0-jessie,但不幸的是行为没有差异。是否有人知道将Docker与fs或流一起使用或可能与之相关的任何东西的特殊行为?