2014-01-22 2 views
0

을 만들면 내 데이터베이스에 모든 "룸"이 포함 된 테이블을 표시하고 방의 작성자에게 표시하려고하지만 사용자의 ID 만 방 테이블에 저장됩니다. , 그래서 나는 user 테이블에 대한 질의를해야만한다. 나는 모든 이름을 가지고이 기능노드 js와 함께 2 개의 비동기 쿼리

build_user(rows[i].creator, function(res){ 

전에

console.log(room_name); 

을 시도하는 경우

socket.on('room', function() { 
    connection.query('SELECT * FROM room', function(err, rows) { 
     for(i=0;i<rows.length;i++) { 
      var room_name = rows[i].name; 
      var room_nbPlayer = rows[i].nbPlayer; 
      var room_language = rows[i].language; 
      build_user(rows[i].creator, function(res){ 
       var username = res; 
       io.sockets.volatile.emit('broadcast_room', "<tr>" + 
        "<td>" + room_name + "</td>" + 
        "<td>" + room_nbPlayer + "</td>" + 
        "<td>" + room_language + "</td>" + 
        "<td>" + username + "</td>" + 
        "</tr>");   
      }); 
     } 
    }); 
}); 
function build_user(id,callback){ 
    connection.query('SELECT username FROM user WHERE id ="'+id+'"', function(err, user) { 
     var username = user[0].username; 
     callback(username); 
    }); 
} 

그래서, exemple에 대한,하지만 한 번 :

나는 이런 식으로 뭔가를 시도 함수에 이름이 모두 같기 때문에 결국 테이블이 잘못되었습니다. 그것은 단지 사용자의 올바른 사용자 이름을 가지고 있지만, 방 쿼리의 모든 변수는 항상 동일한 데이터베이스 (내 데이터베이스의 마지막 방)를 표시합니다.

감사합니다!

답변

0

이것은 build_user가 완료 될 때까지 for 루프가 마지막 항목에 도달했기 때문에 발생합니다. 그래서 room_name, room_language 등이 행의 마지막 항목입니다. 콜백을 통해 해당 데이터를 전달하여 문제를 해결할 수 있습니다.

socket.on('room', function() { 
    connection.query('SELECT * FROM room', function(err, rows) { 
     for(i=0;i<rows.length;i++) { 
      build_user(rows[i], function(username, options){ 
       var room_name = options.name; 
       var room_nbPlayer = options.nbPlayer; 
       var room_language = options.language; 
       io.sockets.volatile.emit('broadcast_room', "<tr>" + 
        "<td>" + room_name + "</td>" + 
        "<td>" + room_nbPlayer + "</td>" + 
        "<td>" + room_language + "</td>" + 
        "<td>" + username + "</td>" + 
        "</tr>"); 
      }); 
     } 
    }); 
}); 

function build_user(options,callback){ 
    var id = options.creator; 
    connection.query('SELECT username FROM user WHERE id ="'+id+'"', function(err, user) { 
     var username = user[0].username 
     callback(username, options); 
    }); 
} 
+0

감사합니다. – user3198601

관련 문제