node.js - 在 AWS Lambda 上使用 mysql2 和 Express 时的 ETIMEDOUT
问题描述
我正在使用 mysql2 包和 Express 框架,部署在 AWS Lamda 上。我将 Aws Lambda 的预置并发设置为 3。
我没有直接连接到 MySQL。我在两者之间有 RDS 代理。
我随机收到以下错误。
{
"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;
const results = await query('SELECT COUNT(*) AS total_listens FROM analytics WHERE event_name="PLAYED"');
任何线索可能是问题所在?
解决方案
AWS Lambda function
最好使用而mysql.createPool
不是mysql.createconnection
. 我不知道具体原因是什么,但使用mysql.createconnection
代替mysql.createPool
也给我带来了问题。release
查询成功时也需要连接。
推荐阅读
- java - 在Java中将带有自定义运算符的String转换为XML格式
- android - 如何在 android studio 中访问 firebase 数据库以进行登录活动
- sql - Saclar 子查询产生了多个元素
- java - 为什么几分钟后 Spring Boot 应用程序和 Consul 之间的 SSL 连接失败?
- godot - Godot 静态和运动实体之间的程序 3D 碰撞
- javascript - React js - 显示或隐藏 div
- xcode - iOS 构建:命令 ld 失败,退出代码为零
- python - 股票市场机器人在应该运行时退出循环
- javascript - 当我在 index.js 中调用它时无法读取未定义的属性“名称”
- javascript - 自定义脚本注入