node.js的'Cannot enqueue Handshake after invoking quit'错误
今天用node.js做无刷新聊天室的时候遇到”Error: Cannot enqueue Handshake after invoking quit.”的问题,在Stack Overflow被点化了。
1 |
|
一开始运行一切正常,但当我执行第二个"query"的时候,会报这个错:
Cannot enqueue Handshake after invoking quit
我试过一直不用.end()方法关掉连接,然并卵。
先谢过。
Radex
那些瞎解答和水贴的我就不翻译了。
根据:
Fixing Node Mysql "Error: Cannot enqueue Handshake after invoking quit.":
http://codetheory.in/fixing-node-mysql-error-cannot-enqueue-handshake-after-invoking-quit/
的
TL;DR 每次关掉连接之后你都需要用createConnection方法创建一个新连接。
以及
Note: 如果你是在伺服web请求,你就不该在每次请求处理完时关掉连接了。服务器启动时创建一个连接,然后一直用connection/client对象查询就好。要处理服务器断开和重连事件时你可以监听错误事件。完整代码:here.
又根据:
Readme.md - Server disconnects:
https://github.com/felixge/node-mysql#server-disconnects
里边说
答题人后面贴了一段自己的自动重连代码,这里我就不贴了。Server disconnects
你可能因为网络问题、服务器超时或者服务器挂了而失去与MySQL服务器的连接。 所有这些情况都被视为"fatal error",而且会有一个错误代码err.code = 'PROTOCOL_CONNECTION_LOST'
。想了解更多可以看看错误处理章节。处理这些不被期望的连接断开的最佳方式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function handleDisconnect(connection) {
connection.on('error', function(err) {
if (!err.fatal) {
return;
}
if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
throw err;
}
console.log('Re-connecting lost connection: ' + err.stack);
connection = mysql.createConnection(connection.config);
handleDisconnect(connection);
connection.connect();
});
}
handleDisconnect(connection);如上例所示,重连是通过创建一个新连接的方式达成的,因为连接对象被设计成一挂掉就无法重连。
使用连接池的时候,挂掉的连接会被从连接池中移除并释放空间,新连接请求到来时自动创建一个新连接。
回答于2013年5月3日18:58
XP1
这个回答虽然没被题主采纳,但我和下面跟帖的一致认为这个回答比较好。
原网页