node.js - 在 AWS 上使用 MySQL 操作时出现随机 ETIMEDOUT 错误
问题描述
我有一个在 NodeJS 上编写的本地应用程序,它与托管在 AWS 上的 MySQL 数据库一起运行。该应用程序已经运行了几个月,没有任何问题。最近,显然是随机的,我得到:
(node:86784) UnhandledPromiseRejectionWarning: Error: connect ETIMEDOUT XX.XX.XX.XX:3306
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1137:16)
在堆栈跟踪中,我看到:
at Protocol._enqueue (/Users/x/y/z/f/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/Users/x/y/z/f/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/Users/x/y/z/f/node_modules/mysql/lib/Connection.js:116:18)
at Connection._implyConnect (/Users/x/y/z/f/node_modules/mysql/lib/Connection.js:454:10)
at Connection.query (/Users/x/y/z/f/node_modules/mysql/lib/Connection.js:196:8)
at internal/util.js:297:30
at new Promise (<anonymous>)
at Connection.subQuery (internal/util.js:296:12)
at _callee3$ (/Users/x/y/z/f/src/persistence/logic.js:84:13)
at tryCatch (/Users/x/y/z/f/node_modules/regenerator-runtime/runtime.js:45:40)
在堆栈跟踪的末尾,可以看到引发错误的 logic.js 文件。
我试图找到引用相同错误的其他帖子,但我看不到与我个人情况的联系。我在几个地方得到了超时,但这段代码可能是一个例子:
export const doThing = async (x, y, z) => {
const connection = getConnection();
const query = util.promisify(connection.query).bind(connection);
const info = {
x: x,
y: y,
z: z,
started_at: new Date()
}
const sql = SQL`INSERT INTO table SET ?`;
try {
await query(sql, info);
}
finally {
connection.end();
}
}
我一直在考虑几个选择:
- 应用层出错。
- 数据库中的配置问题(缺少索引,例如查询慢)。
- AWS 的安全问题。
- 网络问题。
该应用程序已经运行了一段时间,我想不出它现在会失败的原因。尽管应用程序确实执行了一些复杂的查询,但它在琐碎的插入/更新查询上也会失败。最后,谈到安全性,我确实获得了我的 IP,我可以使用 Sequel Pro 访问实例而不会出现问题。我也切换到另一个网络,没有运气。
我不明白发生了什么变化。我最近更新到 macOS Big Sur,但我没有找到类似问题的参考。
解决方案
推荐阅读
- reactjs - React 将组件的 props 作为函数变量传递
- javascript - Ping 主机并在传单弹出窗口上显示结果
- php - php curl代理请求被阻止
- angular - 如何保持角度 PWA 在打盹模式下运行
- sql-server - 无法在 64 位模式下运行 SSIS 包 2015
- visual-studio-code - AL(Business Central OnPremises)中的扩展中的对象 ID 冲突
- pycharm - Pycharm(VM初始化时出错)
- php - 为什么在发送请求 HTTP GET|POST laravel 时变成无穷大
- sharepoint-2013 - Power Apps:在新屏幕上显示表格行
- javascript - React Native 高亮显示项目并返回索引警报