Problème NodeJS/MySQL/Socket.io - Query ne fonctionne pas

Résolu/Fermé
zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016 - 24 sept. 2016 à 02:37
zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016 - 24 sept. 2016 à 03:03
Bonjour/Bonsoir, je suis actuellement en train de faire un projet fonctionnant avec nodeJS et socket.io, je viens de commencer en faisant un petit système d'inscription avec socket.io et mySQL. Toute les étapes de vérification de formulaire fonctionnent apparemment jusqu'au moment ou l'appel à mySQL pose un problème.

Du côté client il n'y a pas de problème, j'envoi un socket avec les données du formulaire (rEmail, rFirstname, rLastname, rPassword, rPasswordCf)

Du côté serveur le problème se pose lors de la vérification de l'email (savoir si l'email est déjà prise, alors j'entreprend d'utiliser la méthode query pour la vérification mais elle ne fonctionne pas et au bout de quelques secondes retourne une erreur: PROTOCOL_CONNECTION_LOST que j'ai essayer de déjouer en utilisant une fonction que j'ai prise sur un autre Forum: handleDisconnect() qui reconnecte MySQL à chaque connection perdue.

Voici mon code (server.js):

/************************************
/************************************
/* Coolife - 0.0.1
/* Real life - like simulation game
/************************************
/***********************************/

var http = require('http');
var mysql = require('mysql');

/************************************
/************************************
/* Configuration de la base de donnée
/************************************
/***********************************/

var db_config = {
host: '< ip du vps >',
port: 8080,
user: 'root',
password: '<mot de passe de la base de donnée>',
database: '<nom de la base de donnée>'
};

var connection;

// Fonction pour reconnecter mysql
function handleDisconnect() {

console.log('handleDisconnect');

connection = mysql.createConnection(db_config); // Recreate the connection, since
// the old one cannot be reused.

connection.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,
} // 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.
connection.on('error', function(err) {
console.log('db error', err.code);
if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
handleDisconnect(); // lost due to either server restart, or a
} else { // connnection idle timeout (the wait_timeout
throw err; // server variable configures this)
}
});
}

handleDisconnect();

httpServer = http.createServer(function(req, res) {
console.log('Un utilisateur a affiché la page');
});

httpServer.listen('8080');

var io = require('socket.io').listen(httpServer);

io.sockets.on('connection', function(socket) {

// Inscription
socket.on('registration', function(data) {

var illegalChars = /[\W_]/;
var regex = /^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$/;

socket.emit('debugClient', data.rEmail);

if (data.rEmail == "" || data.rFirstname == "" || data.rLastname == "" || data.rPassword == "" || data.rPasswordCf == "") {
registrationAlert('Veuillez remplir tous les champs');
} else {

// Je verifie si l'email à la bonne taille
if (data.rEmail.length > 10) {

// Je verifie si l'email est correct
if (regex.test(data.rEmail)) {

socket.emit('debugClient', 'Email correcte');

// Je verifie si l'email est déjà utilisée
//////////////////// A PARTIR D'ICI LE CODE NE SEXECUTE PLUS mais quelques secondes plus tard, affiche une erreur (err) //////////////////////////////////////
connection.query('SELECT * FROM users WHERE email = ?', [data.rEmail], function(err, rows, fields){

if (err) {
handleDisconnect();
socket.emit('test');
socket.emit('debugClient', err.code);
return false;
} else {
socket.emit('test');
}

if (rows.length === 1 && rows[0].email === data.rEmail) {
registrationAlert('L\'email entrée est déjà utilisée');

} else {
//Je verifie si le nom et prénom font la bonne taille
if ((data.rFirstname.length > 2 && data.rLastname.length > 2) && (data.rFirstname.length < 10 && data.rLastname.length < 10)) {

// Je verifie si le nom et prénom sont correct
if (!illegalChars.test(data.rFirstname) && !illegalChars.test(data.rLastname)) {

socket.emit('test');

} else {
registrationAlert('Votre nom ou prénom ne contient pas de bons caractères');
}

} else {
registrationAlert('Votre nom ou prénom ne fait pas la bonne taille');
}
}

connection.end();

});

} else {
registrationAlert('Votre email est invalide');
}

} else {
registrationAlert('Votre email est trop court');
}

}

});

function registrationAlert(msg) {
socket.emit('registrationAlert', msg);
}


});



Le socket debugClient, me permet de faire un console.log qui apparaitra dans la console du navigateur

Le socket test, affiche une alerte "alert();" dans le client (Pour vérification)

la fonction registrationAlert() me permet d'afficher une alerte sur le site en rapport au formulaire d'inscription.

PS: Je suis un peu débutant en nodeJS mais je suis a l'aise avec les notions de javascript/jquery jusqu'à un certain niveau.
Je tiens a préciser que ce code et cette structure est la même en localhost mais dans une version différente et que contrairement à ici, en local cela fonctionne.
Je n'utilise pas Express.

Merci d'avance :)
A voir également:

1 réponse

zack5163v Messages postés 25 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 24 septembre 2016
24 sept. 2016 à 03:03
PS: je suis sous Ubuntu
0