98 votes

Impossible de mettre en file d'attente Handshake après avoir invoqué quit

J'ai mis en œuvre le code suivant :

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();
    }
}

Tout fonctionne très bien, mais seulement pour la première fois. Si je veux "utiliser" la requête pour la deuxième fois, j'obtiens l'erreur suivante :

Cannot enqueue Handshake after invoking quit

J'ai essayé de ne pas .end() des connexions mais ça n'a pas aidé.

Comment puis-je résoudre ce problème ?

2voto

taku Points 86

Je pense que ce problème est similaire au mien :

  1. Connectez-vous à MySQL
  2. Fin du service MySQL (ne doit pas quitter le nœud script)
  3. Démarrer le service MySQL, Node se reconnecte à MySQL
  4. Interrogation de la base de données -> FAIL (Impossible de mettre en file d'attente la requête après une erreur fatale).

J'ai résolu ce problème en recréant une nouvelle connexion avec l'utilisation de promesses (q).

mysql-con.js

'use strict';
var config          = require('./../config.js');
var colors          = require('colors');
var mysql           = require('mysql');
var q               = require('q');
var MySQLConnection = {};

MySQLConnection.connect = function(){
    var d = q.defer();
    MySQLConnection.connection = mysql.createConnection({
        host                : 'localhost',
        user                : 'root',
        password            : 'password',
        database            : 'database'
    });

    MySQLConnection.connection.connect(function (err) {
        if(err) {
            console.log('Not connected '.red, err.toString().red, ' RETRYING...'.blue);
            d.reject();
        } else {
            console.log('Connected to Mysql. Exporting..'.blue);
            d.resolve(MySQLConnection.connection);
        }
    });
    return d.promise;
};

module.exports = MySQLConnection;

mysqlAPI.js

var colors          = require('colors');
var mysqlCon        = require('./mysql-con.js');
mysqlCon.connect().then(function(con){
   console.log('connected!');
    mysql = con;
    mysql.on('error', function (err, result) {
        console.log('error occurred. Reconneting...'.purple);
        mysqlAPI.reconnect();
    });
    mysql.query('SELECT 1 + 1 AS solution', function (err, results) {
            if(err) console.log('err',err);
            console.log('Works bro ',results);
    });
});

mysqlAPI.reconnect = function(){
    mysqlCon.connect().then(function(con){
      console.log("connected. getting new reference");
        mysql = con;
        mysql.on('error', function (err, result) {
            mysqlAPI.reconnect();
        });
    }, function (error) {
      console.log("try again");
        setTimeout(mysqlAPI.reconnect, 2000);
    });
};

J'espère que cela vous aidera.

2voto

Kundan Thakur Points 21

À la place de connection.connect(); utiliser -

if(!connection._connectCalled ) 
{
connection.connect();
}

si elle est déjà appelée, alors connection._connectCalled =true ,
& il n'exécutera pas connection.connect() ;

note - n'utilisez pas connection.end();

0voto

Valvert Points 301

SOLUTION : pour éviter cette erreur (pour AWS LAMBDA) :

Pour sortir de "Nodejs event Loop", vous devez terminer la connexion, puis vous reconnecter. Ajoutez le code suivant pour invoquer le callback :

connection.end( function(err) {
        if (err) {console.log("Error ending the connection:",err);}

       //  reconnect in order to prevent the"Cannot enqueue Handshake after invoking quit"

         connection = mysql.createConnection({
                host     : 'rds.host',
                port     :  3306,
                user     : 'user',
               password : 'password',
               database : 'target database'

               });
        callback(null, {
            statusCode: 200,
            body: response,

        });
    });

0voto

user1739369 Points 21

Si vous essayez d'obtenir un lambda, j'ai trouvé que terminer le gestionnaire avec context.done() a obtenu que le lambda finisse. Avant d'ajouter cette ligne, ça ne faisait que tourner et tourner jusqu'à ce que ça s'arrête.

0voto

Jay Bharat Points 375

Vous pouvez utiliser debug : false,

Exemple : Connexion //mysql

var dbcon1 = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "",
      database: "node5",
      debug: false,
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X