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'
。想了解更多可以看看错误处理章节。处理这些不被期望的连接断开的最佳方式如下:
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
这个回答虽然没被题主采纳,但我和下面跟帖的一直认为这个回答比较好。
原网页:http://stackoverflow.com/questions/14087924/cannot-enqueue-handshake-after-invoking-quit