2014-02-10 2 views
0

Я пытаюсь понять, почему мой indexOf не работает! Собственно, каждый раз, когда пользователь загружает страницу веб-сайта, сервер получает переменную «данные», которая содержит одно (только на данный момент) значение: имя пользователя.NodeJS Socket.IO: indexOf не работает

client.js:

$.ajax({ 
    type: "POST", 
    url: "ajax.php", 
    data: { 
     ajaxRequest: "userInfos" 
    }, 
    success: function(data){ 
     var data = JSON.parse(data); 
     var userInfos = { 
      name: data.username, 
     } 
     socket.emit('pong',JSON.stringify(userInfos)); 
    } 
}); 

server.js:

client.on('pong',function(data){ 
     var data = JSON.parse(data); 
     if(data.name != null) { // On s'assure qu'il est connecté 
      /** VARIABLES SESSION **/ 
      client.set("name",data.name); 
      client.set("id",client.id); 
      /** VARIABLES SESSION **/ 
      if(connected.indexOf(data.name) == -1){ // Si il n'est pas dans le tableau 
       var usersInfos = { 
        name: data.name, 
        id: client.id 
       }; 

       io.sockets.emit('pong',JSON.stringify(usersInfos)); 
       connected.push(JSON.stringify(usersInfos)); // On remet son pseudo 
       console.log("[PONG] "+data.name+" ("+client.id+") est connecté"); 
      } 
     } 
    }); 

Так usersInfos будет завершена только если пользователь уже не существует в объекте, но на самом деле, не работает ... Он нажимает пользователя после каждой загрузки или обновления страницы ...

Вот как заявлены подключения и пользователиInfos:

var connected = []; 
var usersInfos = {}; 

Пожалуйста, помогите мне, я убью кого-нибудь!

ответ

0
connected.push(JSON.stringify(usersInfos)) 
… 
connected.indexOf(data.name) == -1 

Если вы нажимаете JSON строки на connected массив, вы не сможете найти единственную .name там. Надеюсь, что вы сохранили live :-)

+0

Извините за задержку ! Я не понял ... На самом деле данные анализируются «var data = JSON.parse (data)», поэтому в «connected.indexOf (data.name)» «подключено» также анализируется и «данные»! –

+0

Да, 'data' является анализируемым объектом, но' JSON.stringify (usersInfos) 'явно не является. – Bergi

0

Я решил проблему, написав многомерную функцию объекта!

Вот функция:

/** 
* Création d'un tableau d'objets multidimensionnel 
*/ 
function mdimAdd(arrayName,values) { 
    // On vérifie si l'array est déjà un objet ou non. 
    if(typeof(arrayName) == "object") { 
     arrayName = JSON.stringify(arrayName); // Si oui, on la transforme en string 
    } 

    arrayName = arrayName.slice(0,-1); // On supprime le dernier caractère 
    if(S(arrayName).endsWith("}")) { 
     arrayName = arrayName+","; 
    } 

    arrayName = arrayName+""+values; // On rajoute les valeures 
    arrayName = arrayName+"}"; // On ferme l'objet 

    return JSON.parse(arrayName); // On retourne le tableau sous forme d'objet JSON 
} 

А вот линия для создания многомерного объекта:

usersInfos = mdimAdd(usersInfos,'"'+data.name+'": {"name": "'+data.name+'","id": "'+client.id+'"}'); 

Тогда сейчас я могу это сделать:

client.on('pong',function(data){ 
     data = JSON.parse(data); 
     if(data.name != null) { // On s'assure qu'il est connecté 
      /** VARIABLES SESSION **/ 
      client.set("name",data.name); 
      client.set("id",client.id); 
      /** VARIABLES SESSION **/ 

      if(!usersInfos[data.name]){ // Si il n'est pas dans le tableau 
       usersInfos = mdimAdd(usersInfos,'"'+data.name+'": {"name": "'+data.name+'","id": "'+client.id+'"}'); 
       console.log("[PONG] "+data.name+" ("+client.id+") est connecté"); 
      } 
     } 
    });