AWS Lambda только вызывает первую функцию обещания - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь выполнить массовую вставку данных на сервер sql с помощью лямбды, код вставляет данные только для первого аргумента, предоставленного для обещания. Все, при попытке запустить код в автономном режиме, используя без сервера, все работает нормально.

module.exports = async (context, event, callback) => {
    let bulkInsert = async (table, db) => {
        return new Promise(async function (resolve, reject) {
            const request = null;
            try {
                console.log("Bulk inserting data")
                const request = await db.request();
                try {
                    var result = await request.bulk(table);
                    console.log(result)
                    resolve(result)
                } catch (err) {
                    console.log(err);
                    reject(err)
                }
            } catch (err) {
                console.log("Error Occured while inserting data.")
                console.log(err)
                reject(err)
            }
        });
    };
    //Read file from S3
    var file = s3.getObject(params).createReadStream();
    var buffers = [];

    try {

        //Get the metadata for the object
        let s3Header = await s3.headObject(params)
            .promise()


        let db;
        let insertedTaskID;
        try {
            db = await new sql.ConnectionPool(config).connect();
        } catch (err) {
            console.error("Connection failed: " + err);
            throw err;
        }


        file.on("data", function (data) {
            buffers.push(data);
        });

        file.on("end", async function () {
            var buffer = Buffer.concat(buffers);
            var workbook = xlsx.parse(buffer);
            console.log("No of sheets in workbook are:", workbook.length);


            console.log("Remaining Execution Time ", context.getRemainingTimeInMillis())

                console.log("Validation Completed ")
                let firstTableData = getData("10002", workbook, "0")
                let secondTableData = getData("10002", workbook, "1")
                let thirdTableData = getData("10002", workbook, "2")
                let fourthTableData = getData("10002", workbook, "3")

                console.log("Inserting rows to DB")
                //Bulk insert the data into respective tables
                try {
                    await Promise.all([
                        bulkInsert(firstTableData, db),
                        bulkInsert(secondTableData, db),
                        bulkInsert(thirdTableData, db),
                        bulkInsert(fourthTableData, db)

                    ]).catch(err => {
                        console.log("Error on Bulk Insertion ")
                        console.log(err)
                    })


                    console.log("Completed Insertion")
                } catch (err) {
                    console.log("Bulk Insert Failed")
                    console.log(err)
                }

            }
        });

        callback(null, "OK");

    } catch (err) {
        console.log(err)
        callback(err);
    }
};

Вот лямбда-логи, запрос заканчивается перед вставкой в ​​другие таблицы.

    08:26:42
    2019-07-06T08:26:42.266Z    da7e5fd0-acf9-48f0-8dfc-5a2ac712f035    INFO    Bulk inserting data

    08:26:42
    2019-07-06T08:26:42.266Z    da7e5fd0-acf9-48f0-8dfc-5a2ac712f035    INFO    Bulk inserting data

    08:26:42
    2019-07-06T08:26:42.287Z    da7e5fd0-acf9-48f0-8dfc-5a2ac712f035    INFO    Bulk inserting data

    08:26:42
    2019-07-06T08:26:42.287Z    da7e5fd0-acf9-48f0-8dfc-5a2ac712f035    INFO    Bulk inserting data

    08:26:42
    2019-07-06T08:26:42.387Z    da7e5fd0-acf9-48f0-8dfc-5a2ac712f035    INFO    { rowsAffected: 3 }
    
    08:26:42
    END RequestId: da7e5fd0-acf9-48f0-8dfc-5a2ac712f035

1 Ответ

2 голосов
/ 06 июля 2019

Похоже, что лямбда завершает работу до того, как остальные массовые вставки успевают завершиться, вы должны переместить обратный вызов в событие end, чтобы убедиться, что вы выходите из лямбды только после того, как все массовые вызовы запустить например

file.on('end', async () => {
  ...
  callback(null, 'OK');
});

Кроме того, FWIW, если у вас Lambda async, тогда вам не нужно оборачивать await вызовы в этом контексте блоками try/catch, пусть они выбрасывают, и Lambda будет обрабатывать их за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...