NodeJS Async в Lambda не запускает все записи - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть функция NodeJs10 Lambda, чтобы анализировать записи из моей базы данных и сохранять их обратно в базу данных. Когда я запускаю это локально, он анализирует все записи. Когда я запускаю его в лямбда-функции, он анализирует только 3-4 записи. Мое лучшее предположение заключается в том, что Lambda по-разному обрабатывает асинхронные вызовы и считает, что все записи были проанализированы.

Как мне заставить мою функцию Lambda запускать все записи перед выключением?

Мой код выглядиткак это глобально:

'use strict';

// Packages
var Mercury = require('@postlight/mercury-parser');
var Mysql = require('mysql');

// All necessery sql Queries
var sqlSelect = "Select some stuff";
var sqlUpdateText = "Update some stuff";

exports.handler = async function(event, context) {
    // Define the database used in pools
    var pool = Mysql.createPool({
    });

    // Promise where the links and id's are fetched from the database
    let fetchLink = new Promise((resolve, reject) => {
        pool.getConnection((err, connection) => {   // Connection with the database
        });
    });

    // After getting the links and id's, parse the text from the links and put them in a JSON object
    return fetchLink.then(async function (dbresult) {
        if (dbresult.length > 0) {
            await parser();
        }
        return textObj;
    })
    // After parsing
        .then(function (textObj) {
            if (Object.getOwnPropertyNames(textObj).length !== 0) {
                pool.getConnection((err, connection) => {
                    if (err) throw err;
                    for (let id in textObj) {
                        // Do some db stuff
                    }
                    connection.release();
                    pool.end();
                });
            } else {
                pool.end();
            }
        })
        // Catch the error message's
        .catch(function (err) {
            console.log(err);
            pool.end();
        });
};

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Лямбда не будет ждать, пока ваша fetchLink.then() будет закончена. В вашем случае добавление await перед fetchLink.then() сделает эту работу.

// After getting the links and id's, parse the text from the links and put them in a JSON object
    return await fetchLink.then(async function (dbresult) {
        if (dbresult.length > 0) {
            await parser();
        }
        return textObj;
    })

Если приведенное выше решение по-прежнему не решит вашу проблему. Проверьте, правильно ли обрабатывались обратные вызовы async api.

// After parsing
        .then(function (textObj) {
            if (Object.getOwnPropertyNames(textObj).length !== 0) {
                // HANDLE THIS ASYNC OR IT WILL NOT BE WAITED BY LAMBDA
                pool.getConnection((err, connection) => {
                    if (err) throw err;
                    for (let id in textObj) {
                        // Do some db stuff
                    }
                    connection.release();
                    pool.end();
                });
            } else {
                pool.end();
            }
        })

Документы: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

0 голосов
/ 06 ноября 2019
Функция обработчика

не должна быть асинхронной, пока вы нигде не используете await. если ты вернешь обещание, оно все равно будет асинхронным. Я не уверен, как точно выглядит fetchLink обещание, но здесь оно ничего не разрешает / отклоняет, поэтому функция, вероятно, завершается по таймауту. meaby вам нужно исправить это следующим образом

    let fetchLink = new Promise((resolve, reject) => {
        pool.getConnection((err, connection) => {   // Connection with the database
            if(err) reject(err);
            resolve(connection);
        });
    });

также, если вы хотите быть уверены, что функция обработчика завершается с освобождением соединения и завершением пула, лучше возвращать обещания также после анализа и перехвата ошибок. *

если функции connection.release() и pool.end() являются обещаниями или имеют обратные вызовы, их также следует связать в Promise и ожидать в этом случае.

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