node.js的'Cannot enqueue Handshake after invoking quit'错误

    今天用node.js做无刷新聊天室的时候遇到”Error: Cannot enqueue Handshake after invoking quit.”的问题,在Stack Overflow被点化了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
module.exports = {
getDataFromUserGps: function(callback)
{

connection.connect();
connection.query("SELECT * FROM usergps",
function(err, results, fields) {
if (err) return callback(err, null);
return callback(null, results);
}
);
connection.end();
},
loginUser: function(login, pass, callback)
{

connection.connect();
connection.query(
"SELECT id FROM users WHERE login = ? AND pass = ?",
[login, pass],
function(err, results, fields)
{

if (err) return callback(err, null);
return callback(null, results);
}
);
connection.end();
},
getUserDetails: function(userid, callback)
{

connection.connect();
connection.query(
"SELECT * FROM userProfilDetails LEFT JOIN tags ON userProfilDetails.userId = tags.userId WHERE userProfilDetails.userid = ?",
[userid],
function(err, results, fields)
{

if (err) return callback(err, null);
return callback(null, results);
}
);
connection.end();
},
addTags: function(userId, tags)
{

connection.connect();
connection.query(
"INSERT INTO tag (userId, tag) VALUES (?, ?)",
[userId, tags],
function(err, results, fields)
{

if (err) throw err;
}
)
connection.end();
}
}

    一开始运行一切正常,但当我执行第二个"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

    这个回答虽然没被题主采纳,但我和下面跟帖的一致认为这个回答比较好。

    原网页

Fork me on GitHub