Login : Socket.io + Mysql

Ce sujet est résolu
27672
,

Salut,

J'ai une application qui consiste à connecter un membre à son socket et de mettre l'utilisateur dans un tableau des connectés.
Le problème c'est que je n'y arrive pas.

J'utilise mysql pour retrouver le membre qui se connecte, et avoir toutes ses infos (nom et prénom).

Voici mon code server.js :

var https = require('https');
var mysql = require('mysql');
var sha1 = require('sha1');
var app = require('express')();
var fs = require('fs');
var options = {key: fs.readFileSync('../../etc/apache2/ssl/key.key'),cert: fs.readFileSync('../../etc/apache2/ssl/cert.crt')};
var server = https.createServer(options).listen(1812);
var i;

var connection = mysql.createConnection({
    host: '****',
    user: '****',
    password: '****',
    database: '****'
});

var io = require('socket.io').listen(server);
var users = [];

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

    var me;
    for(i = 0; i < users.length; i++) {
        socket.emit('newusr', users[i]);
    }

    socket.on('login', function(user, callback){
        connection.query('SELECT * FROM users INNER JOIN users_infos ON users.id = users_infos.id WHERE email = ? AND mdp = ?',[user.email,sha1(user.mdp)],function(error, rows, fields){
            if(error){
                console.log(error);
                return;
            }
            if(rows.length == 1){
                var userIndex = -1;
                me = rows[0];
                for (i = 0; i < users.length; i++) {
                    if (users[i].email === me.email) {
                        userIndex = i;
                    }
                }
                if(me !== undefined && userIndex === -1){
                    users.push(me);
                    io.sockets.emit('newusr', me);
                    callback(true);
                } else {
                    callback(false);
                }
            }
        });
    });

    socket.on('disconnect', function(){

    });

});

Les noms et prénoms des membres connectés s'affichent bien, mais quand ils se déconnectent ou quitte le navigateur, il ne se déconnecte pas.
J'ai rien mis dans la fonction "disconnect" parce que je ne sais pas quoi mettre

Merci d'avance pour votre aide.

7 Réponse

44835
,

Je pense qu'il faut identifier la connection par le socket. Il faut gérer un tableau associatif qui fait le lien en l'email et le socket.
A la connection tu inscris le user et le socket qui va avec, Au disconnect tu recherches l'email par le socket.
Est-ce clair ?

27672
,

Pas trop, serait-il possible d'avoir un code ?
Merci

44835
,

Je reviens sur ce j'ai dit, cette méthode est celle que j'emploie avec Play! mais pour socket.io il semblerait que ce soit plus facile puis qu'il suffit de rajouter un attribut à l'objet socket (par exemple email), l'attribut sera géré comme une variable de session.
Au login : socket.email = me.email
Au disconnect il suffit de supprimer du tableau users l'élément qui a l'email socket.email
A tester !!!

27672
,

J'ai fais un "console.log" à la déconnexion et dès qu'une connexion se fait, la déconnexion se fait directement.
Je pensais qu'elle se ferais à la fermeture de l'onglet ou de la fenêtre ?

47363
,

Je ne sais pas cela peut aider mais une etudiante de berkeley a fait un bon tuto sur socket.io via youtube, elle est calée amha :)
https://www.youtube.com/watch?v=pNKNYLv2BpQ&list=PLicY6aYZ8ilpmHfJ8jP1lt7ihPpRWBJ9P&index=1

27672
,

Ce tuto, je l'ai vu pleins de fois ^^

47363
,

De même, je me la passait en boucle quand je me formais, si vous avez d'autres ressources videos dans la meme veine, l'etudiante a même crée une video pour scrapper le web, mais je ne l'ai pas encore vu, bon , j'arrete, c'est hors sujet.