我正在 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..”。效果很好。
最佳答案
看来您在这里犯了一些小错误:-
- DB.dbConnection() 不是 DB.js 中的函数,所以我猜代码相当不完整。
- 您必须关闭池才能告诉 lambda 可以安全地使用 pool.end(/callback/fn()=>{}) 结束事务。
- 我强烈建议您使用 context.callbackWaitsForEmptyEventLoop = false;当您发出回调时告诉 lambda 停止,因为 lambda 函数将始终运行,直到达到您设置的超时限制。
快乐编码:)
编辑:- 使用此作为超时相关问题的引用 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html
关于mysql - 意外的 Lambda 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50992854/