Node.JS用管道与事件进行汽蒸

时间:2019-02-01 23:43:46

标签: node.js amazon-web-services amazon-s3 stream pipe

好的,这是一个脑筋急转弯...

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流数据之前遇到了这个问题。

0 个答案:

没有答案