mysql - 意外的 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..”。它工作得很好。
解决方案
看起来你在这里犯了一些小错误:-
- 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
推荐阅读
- github - Github Actions:没有给定文件路径的此类文件或目录
- sql - 如何在 SQL 中从开始日期、开始时间和结束时间获取结束日期
- wso2is - 如何配置基于文件的 SMS OTP 身份提供程序
- java - 如果类的 ojb 实例在 Eclipse 中设置断点
- swift - 以编程方式清空 UIStackView
- javascript - 单击下拉菜单时如何不触发onBlur
- jenkins - 为什么这个脚本只在 Jenkins 上引起问题?
- java - Autowired/Dependencies 注入在 Spring Shell 项目中不起作用
- python - 为什么 __init__ 的 arglist 是元组而不是 Python 中的列表?
- reactjs - 如何在 React 应用程序中将现有的 pdf 转换为 html 元素