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 错误的主要内容,如果未能解决你的问题,请参考以下文章
未能在 Mac(Apple M1)上安装 opencv4nodejs 会引发找不到路径错误
当 cp 没有时,为啥 shutil.copy() 会引发权限异常?