今天用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
54module.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
16function 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
这个回答虽然没被题主采纳,但我和下面跟帖的一致认为这个回答比较好。
原网页