我正在创建一些测试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设置可能有所不同?...
答案 0 :(得分:0)
我遇到了这个确切的问题。我在var connection = mysql.createConnection({ ... });
函数外部创建连接exports.handler
。根据{{3}}。全局变量保留在所有lambda执行中。因此,我将连接创建移到了exports.handler
函数内部,并解决了问题。但是,我对lambda并不陌生,因此可能会有更好的实现。