Npm mysql + AWS Lambda:调用退出后无法排队查询

时间:2019-11-12 22:28:46

标签: mysql amazon-web-services npm aws-lambda

我正在创建一些测试AWS Lambda函数,并且正在使用npm mysql软件包连接到RDS数据库。我有以下代码,可以正常工作。但是,每次其他击中该功能都会导致错误。

代码:

exports.handler = (event, context, callback) => {
    connection.query("SELECT * FROM `cubes`", function (error, results, fields) {
        if (error) {
            connection.destroy();
            throw error;
        } else {
            // connected!
            console.log(results);
            callback(null, results);
            connection.end(function (err) { callback(err, results);});
        }
        return context.logStreamName
    });
};

错误:

  

{“ errorType”:“ Error”,“ errorMessage”:“调用退出后无法排队查询。”,“ trace”:> [[“ Error:调用退出后无法排队查询。”,“ at Protocol._validateEnqueue( /var/task/node_modules/mysql/lib/protocol/Protocol.js:215:16)“,”在Protocol._enqueue(/var/task/node_modules/mysql/lib/protocol/Protocol.js:138:13) “,”在Connection.query(/var/task/node_modules/mysql/lib/Connection.js:201:25)“,”在Runtime.exports.handler(/var/task/index.js:10:16) “,”在Runtime.handleOnce(/var/runtime/Runtime.js:66:25)“]}

我一直在寻找解决方案,但是没有找到可行的解决方案。我什至尝试注释掉connection.end()部分,但随后该功能完全超时。根据诸如https://stackoverflow.com/a/15267082/1015214之类的帖子,似乎只需在代码中的任何位置包含connection.end()都是可以的,因为总会在结尾处触发它,但是AWS Lambda设置可能有所不同?...

1 个答案:

答案 0 :(得分:0)

我遇到了这个确切的问题。我在var connection = mysql.createConnection({ ... });函数外部创建连接exports.handler。根据{{​​3}}。全局变量保留在所有lambda执行中。因此,我将连接创建移到了exports.handler函数内部,并解决了问题。但是,我对lambda并不陌生,因此可能会有更好的实现。