When to close MySQL connection using node-mysql?


Question

Currently using: https://github.com/felixge/node-mysql

I have the following code:

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'me',
    password : 'secret',
    database : 'Database1'
});
app.put('/api/upload', function(req, res, next)
{
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

The put request works perfectly fine, but calling it the second time, I get the following error

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)

Am I supposed to leave the connection open until the server dies?

UPDATE: When I move the mysql.createConnection into the put request function like so:

var connection = null; 
app.put('/api/upload', function(req, res, next)
{
    connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'me',
        password : 'secret',
        database : 'Database1'
    });
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

It works fine. Does this mean connection.end() closes what mysql.createConnection created and cannot be reconnected?

1
25
1/4/2019 1:26:23 PM

Accepted Answer

connection.end() does it job regardless to fatal error. If a fatal error occurs before the COM_QUIT packet can be sent, an err argument will be provided to the callback, but the connection will be terminated regardless of that.

Also check destroy() method. This will cause an immediate termination of the underlying socket.

You can add error handler.

https://github.com/felixge/node-mysql/blob/master/Readme.md#error-handling

connection.on('error', function() {});

Once terminated, an existing connection object cannot be re-connected by design.

Check here. It's showing connecting back after disconnect.

https://github.com/felixge/node-mysql/blob/master/Readme.md#server-disconnects

24
1/4/2019 1:27:27 PM

I believe the proper way is to just get a connection for your app at startup, and end() it when your app closes.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon