Problème NodeJS/MySQL/Socket.io - Query ne fonctionne pas
Résolu
zack5163v
Messages postés
25
Date d'inscription
Statut
Membre
Dernière intervention
-
zack5163v Messages postés 25 Date d'inscription Statut Membre Dernière intervention -
zack5163v Messages postés 25 Date d'inscription Statut Membre Dernière intervention -
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):
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 :)
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:
- Problème NodeJS/MySQL/Socket.io - Query ne fonctionne pas
- Power query download - Télécharger - Tableur
- Mysql community server - Télécharger - Bases de données
- Sql query download - Télécharger - Gestion de données
- Flyspeed sql query - Télécharger - Bases de données
- Xampp mysql ne démarre pas ✓ - Forum MySQL