мой код node.js работает нестабильно в aws-lambda, иногда он работает нормально, иногда пропуская постоянство данных в этой части кода - PullRequest
0 голосов
/ 11 января 2019

Центр обработки данных загружает CSV-файл в наше хранилище S3 каждые пять минут, что вызывает мою лямбда-функцию для чтения файла и сохранения данных в DynamoDB. Но код, который выполняет сохранение данных, нестабилен, иногда он будет выполняться, а иногда он будет полностью пропущен. Это меня очень смущает. Вот мой код.

    var AWS = require('aws-sdk');
    var csvtojson = require('csvtojson');
    var  encoding = require('text-encoding');
    AWS.config.update({
        accessKeyId: '********',
        secretAccessKey: '**********',
        region: 'us-west-2',
        sslEnabled:false
    });

    var s3 = new AWS.S3();
    var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

    exports.handler = async (event) => {
        try {
            console.log(event);
            console.log(event['Records'][0]['s3']['object']['key']);
            //get the file name
            let key = event['Records'][0]['s3']['object']['key'];
            let date = `${key}`.slice(24,36);
            console.log(date);
            let getObject = {Bucket: 'saas-status-mockup-data', Key: `${key}`};
            //get the object
            let response = await s3.getObject(getObject).promise();
            //transfer to csv
            let csvFile= new encoding.TextDecoder("utf-8").decode(response.Body);
            //transfer to json
            let res = await csvtojson().fromString(csvFile);
            console.log(res);
            await res.map(async(item,key) => {
                console.log(item);
                let putParams = {};
                if(item.FARM=="SMAX Internal production Functionalities"){
                    putParams.TableName = 'InternalProductionDb';
                } else if(item.FARM=="SMAX Trial Major Functionalities"){
                    putParams.TableName = 'TrialMajorDb';
                } else {
                    console.error(item);
                }
                putParams.Item = {
                    'Date' : {
                        S:`${date}${item.BUSINESS_PROCESS}`
                    },
                    'StatusId':{
                        S:`${date}${item.BUSINESS_PROCESS}`
                    },
                    'BusinessProcess':{
                        S:`${item.BUSINESS_PROCESS}`
                    },
                    'Status':{
                        S:`${item.STATUS}`
                    }
                };
                console.log(putParams);
                //put data to dynamoDB, But sometimes this code sometimes does not execute.
                let putRes = await ddb.putItem(putParams).promise();
                console.dir(putRes);
            });
        }
        catch(error){
            console.error(error);
            return error;
        }
    };

1 Ответ

0 голосов
/ 11 января 2019

Array.map() возвращает массив, а не Promise, поэтому вы не можете await его (например, await res.map() в своем коде).

Сначала вы должны собрать список обещаний и использовать Promise.all(), чтобы дождаться их всех.

exports.handler = async (event) => {
    try {
        console.log(event);
        console.log(event['Records'][0]['s3']['object']['key']);
        //get the file name
        let key = event['Records'][0]['s3']['object']['key'];
        let date = `${key}`.slice(24,36);
        console.log(date);
        let getObject = {Bucket: 'saas-status-mockup-data', Key: `${key}`};
        //get the object
        let response = await s3.getObject(getObject).promise();
        //transfer to csv
        let csvFile= new encoding.TextDecoder("utf-8").decode(response.Body);
        //transfer to json
        let res = await csvtojson().fromString(csvFile);
        console.log(res);

        // Construct the list of promises.
        const promises = res.map((item, key) => {
            console.log(item);
            let putParams = {};
            if(item.FARM=="SMAX Internal production Functionalities"){
                putParams.TableName = 'InternalProductionDb';
            } else if(item.FARM=="SMAX Trial Major Functionalities"){
                putParams.TableName = 'TrialMajorDb';
            } else {
                console.error(item);
            }
            putParams.Item = {
                'Date' : {
                    S:`${date}${item.BUSINESS_PROCESS}`
                },
                'StatusId':{
                    S:`${date}${item.BUSINESS_PROCESS}`
                },
                'BusinessProcess':{
                    S:`${item.BUSINESS_PROCESS}`
                },
                'Status':{
                    S:`${item.STATUS}`
                }
            };
            console.log(putParams);
            //put data to dynamoDB, But sometimes this code sometimes does not execute.
            return ddb.putItem(putParams).promise();
        });

        // Wait for all promises to finish.
        return Promise.all(promises)
    }
    catch(error){
        console.error(error);
        return error;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...