Node.js 在AWS Lambda上使用mysql2和Express时退出
我正在使用mysql2包和Express框架,部署在AWS Lamda上。我将Aws Lambda的已配置并发设置为3 我没有直接连接到MySQL。我有RDS代理在中间 我随机得到以下错误Node.js 在AWS Lambda上使用mysql2和Express时退出,node.js,aws-lambda,mysql2,Node.js,Aws Lambda,Mysql2,我正在使用mysql2包和Express框架,部署在AWS Lamda上。我将Aws Lambda的已配置并发设置为3 我没有直接连接到MySQL。我有RDS代理在中间 我随机得到以下错误 { "errorType": "Error", "errorMessage": "connect ETIMEDOUT", "code": "ETIMEDOUT",
{
"errorType": "Error",
"errorMessage": "connect ETIMEDOUT",
"code": "ETIMEDOUT",
"errorno": "ETIMEDOUT",
"syscall": "connect",
"fatal": true,
"stack": [
"Error: connect ETIMEDOUT",
" at Connection._handleTimeoutError (/var/task/node_modules/mysql2/lib/connection.js:178:17)",
" at listOnTimeout (internal/timers.js:554:17)",
" at processTimers (internal/timers.js:497:7)"
]
}
以下是我的代码的外观:
var AWS = require("aws-sdk");
const mysql = require('mysql2');
class DBConnection {
constructor() {
var signer = new AWS.RDS.Signer({
region: 'us-east-1',
hostname: process.env.DB_HOST,
port: 3306,
username: process.env.DB_USER
});
let connectionConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
database: process.env.DB_NAME,
ssl: 'Amazon RDS',
authPlugins: { mysql_clear_password: () => () => signer.getAuthToken() }
};
this.db = mysql.createConnection(connectionConfig);
}
query = async (sql, values) => {
return new Promise((resolve, reject) => {
this.db.execute(sql, values, (error, result) => {
if (error) {
reject(error);
return;
}
resolve(result);
});
});
}
}
module.exports = new DBConnection().query;
有什么线索可以说明问题在哪里吗?使用
AWS Lambda函数
最好使用mysql.createPool
而不是mysql.createconnection
。我不知道具体原因是什么,但是使用mysql.createconnection
而不是mysql.createPool
也给我带来了问题。当查询成功时,释放连接也是必要的。我不是很确定,但是,似乎因为是lambda函数,它为每个调用创建了一个实例,并且当连接较少(lambda函数实例较少)时,您没有释放连接(破坏连接),当并发多个lambda处于活动状态时,它将获得连接超时。尝试在工作完成后释放连接,我不确定它将如何扩展,尽管流量很大。
const results = await query('SELECT COUNT(*) AS total_listens FROM analytics WHERE event_name="PLAYED"');