18

What does the error mean?

{ [Error: Cannot enqueue Query after fatal error.] code: 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR', fatal: false }

This code works in my test file:

function handleDisconnect() {
    objConn = mysql.createConnection(db_config);    // Recreate the connection, since
                                                    // the old one cannot be reused.
    objConn.connect(function(err) {                 // The server is either down
        if(err) {                                   // or restarting (takes a while sometimes).
            console.log('error when connecting to db:', err.code);
            setTimeout(handleDisconnect, 2000);     // We introduce a delay before attempting to reconnect,
        }else{
            console.log('Connected to db!');
        }                                           // to avoid a hot loop, and to allow our node script to
    });                                             // process asynchronous requests in the meantime.
                                                    // If you're also serving http, display a 503 error.
    objConn.on('error', function(err) {
        if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
            handleDisconnect();                       // lost due to either server restart, or a
        }else{
            throw err;
        }
    });
}

handleDisconnect();
megaLoop();

function megaLoop(){
    objConn.query('SELECT u.`email` FROM `users` as u', function(err, rows) {
        console.log(err);
        console.log(rows);
    });
    setTimeout(megaLoop, 100); 
}

But when I use the function in my Express App I get the error:

{ [Error: Cannot enqueue Query after fatal error.] code: 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR', fatal: false }

Why does it work in my test and not my app?

random_user_name
  • 24,784
  • 7
  • 72
  • 107
Krister Johansson
  • 663
  • 2
  • 8
  • 32

2 Answers2

12

I had similar issue connecting with MySQL. I solved this issue using connection pool. The concept is to get a connection from a connection pool only when required and release it after use. That way the connection will not be in unstable state. You can get implementation details here.

Sawal Maskey
  • 598
  • 2
  • 6
  • 18
  • this is the correct answer.. many thanks, I had the same issue and fixed it by following this article – Jethik Oct 02 '18 at 11:49
  • Releasing connection every now and then doesn't sound like performance-wise solution. – jayarjo Nov 27 '18 at 16:28
  • 1
    @jayarjo I thought "release" in this context does not mean closing the connection. The connection remains active and is available in the pool to be used again. In fact, using a connection pool can improve performance by avoiding closing and reopening connections when you are running multiple requests asynchronously / in parallel. – JohnRC Sep 02 '20 at 11:44
0

I believe the issue is an express-sql-session. I'm experiencing the same issue right now. I think someone is on to something at this post: NodeJS running on MAC, and have an error occurred when deploying on centOS

Check this out too: https://github.com/felixge/node-mysql/issues/1166

Community
  • 1
  • 1
Scott
  • 762
  • 1
  • 11
  • 18