2012-04-20 5 views
2

nodejs에 mysql 모듈을 사용하고 있습니다.NodeJS의 mysql 쿼리 타이밍 문제

이 같은 작업을 수행하려고하지만 쿼리의 콜백이 비동기이며 결과 배열을 올바르게 채울 수 없다는 문제가 있습니다. 어떻게하면됩니까? 감사!

function fn(callback) { 
    client.query(
     'SELECT * FROM imbarcazioni', 
     function select(err, ships) { 
     if(err) { 
      throw err; 
     } 

     ships.forEach(function(ship) { 
      client.query(
       'SELECT * FROM storico_imbarcazioni WHERE id_imbarcazione=' + ship.id, 
       function select(err, hist) { 
        ship.history = hist; 
       } 
      ); 
     }); 

     callback(hist); 
    }); 
} 

답변

3

평소와 마찬가지로 이러한 종류의 작업에는 async을 권장합니다. 여기에서, 당신은 async.map을 사용할 수

function selectHistory(ship, callback) { 
    client.query('SELECT * FROM storico_imbarcazioni WHERE id_imbarcazione = ?', [ship.id], function(err, history) { 
     if(err) return callback(err); 
     ship.history = history; 
     callback(null, ship); 
    }); 
} 

client.query('SELECT * FROM imbarcazoni', function(err, ships) { 
    async.map(ships, selectHistory, function(err, ships) { 
     // ships is an array with each ship along with it's history 
    }); 
}); 

말했다 즉, 특정 예를 들어, 차라리 JOIN을 사용하고 SQL에서 처리 :

SELECT * FROM imbarcazioni 
LEFT JOIN storico_imbarcazoni ON storico_imbarcazoni.id_imbarcazione = imbarcazioni.id 
+0

덕분에, 내가 무엇을 찾고 있어요입니다! 왼쪽 가입을 위해 노력했지만 성공하지 못했습니다 .. – frx08

+0

@ frx08 : 고마워요! 나는 (JOIN을 위해) SQL 문을 고쳤다. 몇 가지 오류가 있었다. [JOIN에서 읽어야합니다] (http://en.wikipedia.org/wiki/Join_ (SQL)), [여기서는 멋진 시각화입니다] (http://www.codinghorror.com/blog/2007/) 10/a-visual-explanation-of-sql-joins.html)에 의해 작성된 StackOverflow 공동 설립자 인 Jeff Atwood. –

+0

SQL 방식의 문제는 SQL 쿼리를 통해 많은 중복 객체를 얻는 동안 자체 히스토리 객체가 포함 된 단일 배 객체를 갖고 싶다는 것입니다. – frx08