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

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


你可能感兴趣的:(node.js)