首页 > 解决方案 > 意外的 Lambda 行为

问题描述

我正在 AWS Lambda 上做 POC。Lambda 表现出意外行为。

Lambda代码如下

var DB = require('../util/DB')
let response;

exports.lambda_handler = async (event, context, callback) => {

    console.log("Starting");
    try {
        var connection = await DB.dbConnection();
        connection.release();
        response = {
            'statusCode': 200,
            'body': JSON.stringify({
                message: 'hello world'
            })
        }
        console.log(response)
        callback(null, response)
    }
    catch (error) {
        console.log(error)
        callback(error, null)

    }
    console.log("Sending Response")
    callback(null, response)
};

DB.js 是

var mysql = require('mysql');

let pool = mysql.createPool({
    connectionLimit: 10,
    host: host,
    user: user,
    password: password,
    port: "3306",
    database: database,
    multipleStatements: true
});

pool.on('enqueue', function () {
    console.error('runQry-Waiting for available connection callback');
});

function getConnection() {
    return new Promise((resolve, reject)=> {
        pool.getConnection(function(err, connection) {
            if(err) {
                console.log("\n\nerror")
                reject(err)
            } else {
                console.log("\n\nresolve")
                resolve(connection)
            }
          });
    })
}

当我执行 lambda 时,它会在控制台中打印出“Starting”、“resolve”、“response”和“Sending Response”,然后等待超时。

我尝试注释掉“var connection..”和“connection..”。它工作得很好。

标签: mysqlnode.jsaws-lambda

解决方案


看起来你在这里犯了一些小错误:-

  1. DB.dbConnection() 不是 DB.js 中的函数,所以我猜代码相当不完整。
  2. 您必须关闭池以告诉 lambda 使用 pool.end(/ callback /fn()=>{}) 结束事务是安全的。
  3. 我强烈建议您使用 context.callbackWaitsForEmptyEventLoop = false; 当您发出回调时告诉 lambda 停止,因为 lambda 函数将始终运行,直到达到您设置的超时限制。

快乐编码:)

编辑:- 使用这个作为超时相关问题的参考https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html


推荐阅读