意外的Lambda行为

时间:2018-06-22 17:21:05

标签: mysql node.js aws-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时,它将在控制台中打印出“正在启动”,“解决”,响应和“发送响应”,然后等待直到超时。

我尝试注释掉“ var connection ..”和“ conection ..”。工作正常。

1 个答案:

答案 0 :(得分:0)

您似乎在这里犯了一些小错误:-

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

快乐编码:)

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