好的,这是一个脑筋急转弯...
pipeFlow :
export function main(event) {
let s3 = new AWS.S3();
let data = event;
const fileName = data.file;
const params = {
Bucket: config.s3.inputBucketName,
Key: fileName
};
const fileStream = s3.getObject(params).createReadStream();
const parser = csv.parse({
skip_empty_lines: false,
auto_parse: false,
columns: true,
delimiter: ','
});
const transformer = csv.transform((data) => {
const keys = Object.keys(data);
const values = _.values(data);
if (!_.isEqual(keys, values)) {
return doSomething(data, param1, param2).then(() => {
/* eslint-disable no-console */
// console.log(result);
}).catch((e) => {
console.error(e);
});
}
},
{ parallel: 1 }
);
const stringifier = csv.stringify();
fileStream
.pipe(parser).on('error', (error) => {
console.log('parser error');
console.log(error);
}).pipe(transformer).on('error', (error) => {
console.log('transformer error');
console.log(error);
}).pipe(stringifier).on('error', (error) => {
console.log('stringifier error');
console.log(error);
});
}
eventFlow :
export function main(event) {
let s3 = new AWS.S3();
let data = event;
let streamData;
let parserData;
let transformData;
const fileName = data.file;
const params = {
Bucket: config.s3.inputBucketName,
Key: fileName
};
const fileStream = s3.getObject(params).createReadStream();
const parser = csv.parse({
skip_empty_lines: false,
auto_parse: false,
columns: true,
delimiter: ','
});
const transformer = csv.transform((data) => {
const keys = Object.keys(data);
const values = _.values(data);
if (!_.isEqual(keys, values)) {
return doSomething(data, param1, param2).then(() => {
/* eslint-disable no-console */
// console.log(result);
}).catch((e) => {
console.error(e);
});
}
},
{ parallel: 1 }
);
const stringifier = csv.stringify();
fileStream.on('readable', function () {
while ((streamData = fileStream.read())) {
parser.write(streamData);
}
});
parser.on('readable', function () {
while ((parserData = parser.read())) {
transformer.write(parserData);
// stringifier.write(data);
}
});
transformer.on('readable', function () {
while ((transformData = transformer.read())) {
stringifier.write(transformData);
}
});
}
所以,pipeFlow工作,但只有没有错误,警告或什么奇怪退出前输出32785分的记录。
eventFlow可以完美运行,并输出所有记录,而与文件大小无关。
我的问题是:'该死的家伙是什么?'
阅读网上似乎表明正确的,在我看来,更容易阅读的方法是使用管道。那我为什么用管道出口缺少早期没有错误。
此外,从本地文件(使用节点fs)流式传输,而不是从s3流式传输,似乎都可以使两个流正常工作。
我还尝试了多个文件,并且在构建大型数据库导出器时从AWS流数据之前遇到了这个问题。