NodeJS:MySQL 有时会引发 ETIMEDOUT 错误

Posted

技术标签:

【中文标题】NodeJS:MySQL 有时会引发 ETIMEDOUT 错误【英文标题】:NodeJS: MySQL sometimes raises ETIMEDOUT error 【发布时间】:2016-03-04 09:27:15 【问题描述】:

我目前正在使用 NodeJS 开发应用程序。

但是,经常服务器会抛出这个错误,我无法与mysql交互。

 [Error: read ETIMEDOUT]
  code: 'ETIMEDOUT',
  errno: 'ETIMEDOUT',
  syscall: 'read',
  fatal: true 
 [Error: Cannot enqueue Query after fatal error.] code: 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR', fatal: false 

有人有解决方案吗?

谢谢

【问题讨论】:

您是否尝试重新连接(假设问题是连接丢失)? 这实际上是两个独立的错误。其次,这是正常行为,因为一旦发生致命错误,您尝试查询连接时就会发生这种情况。您可能在代码中早些时候调用了连接上的方法,例如查询,并且不小心没有检查返回的错误。另一种可能性是您正在检查错误,但不检查 err.fatal 是否为真并丢弃连接。 嘿,您可能已经与 app.js 中必须需要的其他文件中的 sql 建立了连接,并且会在 app.js 或任何其他文件中执行查询包括在内。现在,在建立连接之前或在连接对象中出现错误之后,您仍在进行查询。 @mscdex : 是的,我可以重新连接,因为我关闭了服务器 @Gary:也许可以,但是为什么一个基本请求会抛出致命错误? 【参考方案1】:

根据您的问题,我假设您可以完美地使用您的数据库,但此错误经常发生在该连接启动的给定时间后...

假设您使用的是node-mysql 来源:https://github.com/felixge/node-mysql#error-handling 您的错误终止了您与数据库的连接:

err.fatal: 布尔值,指示此错误是否是连接对象的终端。 如果错误不是来自 MySQL 协议操作,则不会定义此属性。

注意:“错误”事件在节点中是特殊的。如果它们发生时没有 附加侦听器,打印堆栈跟踪并且您的进程是 被杀了。

tl;dr: 此模块不希望您处理静默故障。你 应始终为您的方法调用提供回调。如果你想 忽略此建议并抑制未处理的错误,您可以这样做:

    // I am Chuck Norris:
connection.on('error', function() );

由此您可以检查连接状态并在需要时执行重新连接。


您也可以尝试手动连接到您的 mysql 服务并更改请求超时:

wait_timeout” : the amount of seconds during inactivity that MySQL will wait before it will close a connection on a non-interactive connection in seconds.

http://www.serveridol.com/2012/04/13/mysql-interactive_timeout-vs-wait_timeout/https://support.rackspace.com/how-to/how-to-change-the-mysql-timeout-on-a-server/

【讨论】:

【参考方案2】:

尝试使用 mysql2 而不是 mysql npm pakcage。它会解决你的问题。

完整解释here

【讨论】:

以上是关于NodeJS:MySQL 有时会引发 ETIMEDOUT 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何处理nodejs中的数组缓冲区分配失败?

未能在 Mac(Apple M1)上安装 opencv4nodejs 会引发找不到路径错误

标准排序有时会引发分段错误

当 cp 没有时,为啥 shutil.copy() 会引发权限异常?

服务仅有时会引发 No 'Access-Control-Allow-Origin' 标头错误

Python OpenCV 人脸检测代码有时会引发“元组”对象没有属性“形状”