web-dev-qa-db-fra.com

Le nœud Mysql ne peut pas mettre en file d'attente une requête après avoir appelé quitter

où puis-je fermer la connexion mysql?

J'ai besoin d'exécuter des requêtes en séquence. J'écris un code qui ressemble à ceci à l'heure actuelle:

var sqlFindMobile = "select * from user_mobiles where mobile=?";
var sqlNewUser = "insert into users (password) values (?)";
//var sqlUserId = "select last_insert_id() as user_id";
var sqlNewMobile = "insert into user_mobiles (user_id, mobile) values (?,?)";
connection.connect(function(err){});
var query = connection.query(sqlFindMobile, [req.body.mobile], function(err, results) {
    if(err) throw err;
    console.log("mobile query");
    if(results.length==0) {
        var query = connection.query(sqlNewUser, [req.body.password], function(err, results) {
            if(err) throw err;
            console.log("added user");
            var user_id = results.insertId;
            var query = connection.query(sqlNewMobile, [user_id, req.body.mobile], function(err, results) {
                if(err) throw err;
                console.log("added mobile");
                    //connection.end();
                });
        });
    }
});
//connection.end();

(Je suis un débutant avec node, npm-express et npm-mysql. J'ai essayé de rechercher SO pour "exprimer mysql ne peut pas mettre en file d'attente" pour trouver des questions connexes et je ne les ai pas trouvées.)

22
Kinjal Dixit

J'ai résolu ce problème, utilisez cette méthode.

connection.end () dans votre fonction connection.query

Le code fixe est here

25
unlimited

Si vous utilisez le module node-mysql de felixge, vous pouvez appeler connection.end () à tout moment après avoir passé tous les appels connection.query (), car attendez que toutes les requêtes se terminent avant de mettre fin à la connexion.

Voir l'exemple ici pour plus d'informations.

Si vous souhaitez exécuter de nombreuses requêtes en série, consultez le module async , qui est idéal pour traiter une série de fonctions asynchrones (c'est-à-dire celles qui ont un rappel).

10
matthewtole

Le problème est peut-être que la requête mySQL est exécutée après la fermeture de la connexion, en raison de la nature asynchrone de Node. Essayez d’utiliser ce code pour appeler connection.end () juste avant la fin du thread:

function exitHandler(options, err) {
    connection.end();
    if (options.cleanup)
        console.log('clean');
    if (err)
        console.log(err.stack);
    if (options.exit)
        process.exit();
}

//do something when app is closing
process.on('exit', exitHandler.bind(null, {cleanup: true}));

Code adapté de @Emil Condrea, effectue une action de nettoyage juste avant la sortie de node.js

5
user3413723

Dans mon cas, connection.end était appelé à un endroit difficile à remarquer. Un appel erroné à connection.end pourrait donc être le problème de cette erreur. 

1
Kyle Roux