【问题标题】:NodeJS: MySQL sometimes raises ETIMEDOUT errorNodeJS:MySQL 有时会引发 ETIMEDOUT 错误
【发布时间】: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:也许可以,但是为什么一个基本请求会抛出致命错误?

标签: mysql node.js express error-handling


【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 2017-01-24
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多