2014-07-24 5 views
2

여러 SQL 쿼리를 실행하려고합니다.node.js에서 여러 MSSQL 쿼리 실행

문제는 변수가 node.js가 사용하는 fire-and-forget 때문에 범위를 벗어납니다. C#에서 await 키워드와 비슷한 작업을 수행하기 위해 노력하고 있습니다.

여기 내 깨진 코드입니다. 이는 내가 달성하기 위해 노력하고 무엇에 관해서는 명확하게해야합니다

function getTopicsForMessages(request, results) 
{ 
    //Get topics for this message 
    var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri"; 
    queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes"; 
    queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)"; 
    queryString += " WHERE messageId = ?"; 

    for (var i = 0; i < results.length; i++) 
    { 
     mssql.query(queryString, [results[i].id], 
     { 
      success: function (topicsResults) 
      { 
       results[i].topics = topicsResults; 
      }, 
      error: function (err) { 
       console.error("SQL Read error: " + err); 
       request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read"); 
      } 
     }); 
    } 
    //Continue... once all queries have executed successfully. 
} 

을 나는이 그냥 아주 일을하는 노드 방법을 모르고의 문제라고 생각합니다.

나는 await 키워드와 비슷한 것을 허용하는 Node.js에 대한 몇 가지 패키지/옵션에 대해 읽었지만 Azure Mobile Services를 사용함에 따라 이들을 사용할 수 있는지 확실하지 않습니다.

나는이 쿼리를 SQL에서 더 잘 할 수 있다고 확신한다. 그러나 다시, 나는 어떻게 확신이 들지 않습니다. 사전에

많은 감사,

대니

+0

당신이 사용 약속 패턴을 사용하려면 : http://stackoverflow.com/questions/17351494/promises-pattern-in-node-js-libraries-to-use를 – Populus

+0

당신은 명시 적 사용하고 있습니까? – Dalorzo

답변

0

아래의 코드는 하나의 가능한 구현을 보여줍니다. node.js의 모든 DB 호출은 비동기식이므로 "일반"for 루프로 실행하면 DB에 대한 모든 호출을 동시에 전송하므로 일부 할당량이 트리거 될 수 있습니다. 아래의 코드는 쿼리를 한 번에 하나씩 보냅니다. 한 번의 호출이 완료 될 때까지 기다렸다가 다음 호출을 호출합니다. 일부 쿼리는 병렬로 전송할 수도 있습니다 (this post에 표시된 일괄 처리 기법과 비슷한 것을 사용).

function getTopicsForMessages(request, results) 
{ 
    //Get topics for this message 
    var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri"; 
    queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes"; 
    queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)"; 
    queryString += " WHERE messageId = ?"; 

    var queryNextItem = function(i) { 
     if (i >= results.length) { 
      // All done 
      continuation(); 
     } else { 
      mssql.query(queryString, [results[i].id], 
      { 
       success: function (topicsResults) 
       { 
        results[i].topics = topicsResults; 
        queryNextItem(i + 1); 
       }, 
       error: function (err) { 
        console.error("SQL Read error: " + err); 
        request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read"); 
       } 
      }); 
     } 
    } 

    queryNextItem(0); 

    function continuation() { 
     //Continue... once all queries have executed successfully. 
    } 
} 
관련 문제