Lambda中的NodeJS Async不会运行所有条目

我有一个NodeJs10 Lambda函数来解析数据库中的条目并将其保存回数据库中。当我在本地运行时,它将解析所有条目。当我在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();
        });
};
junqiou 回答:Lambda中的NodeJS Async不会运行所有条目

当您不在任何地方使用await时,

handler函数不需要是异步的。如果您返回诺言,无论如何它都是异步的。我不确定fetchLink的外观如何,但是在这里它不能解决/拒绝任何事情,因此功能可能会在超时时完成。测量您需要像这样

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

如果您还想确保处理程序函数以释放连接并结束池为结束,那么在解析和捕获错误之后,也更好地返回promise。

    .then(function (textObj) {
        return new Promise((resolve,reject) => {
            if (Object.getOwnPropertyNames(textObj).length !== 0) {
                pool.getConnection((err,connection) => {
                    if (err) return reject(err);
                    for (let id in textObj) {
                        // Do some db stuff
                    }
                    connection.release();
                    pool.end();
                    resolve();
                });
            } else {
                pool.end();
                resolve();
            }
        }    
    })

如果connection.release()pool.end()函数是Promise或具有回调,则也应将它们绑定在Promise中,然后等待。

,

Lambda不会等待您的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;
    })

如果上述解决方案仍然无法解决您的问题。检查调用异步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

本文链接:https://www.f2er.com/3153565.html

大家都在问