2014-02-25 55 views
0

我想assing從兩個表中,第一個表的SELECT查詢從在結果值獲取ID和assing下一查詢結構數組,這裏是我的代碼訪問多個表併發的Mysql的NodeJS

var query = db.query('select * from orderdish'), 
users = []; 
query 
.on('error', function(err) 
{ 
    console.log(err); 
    updateSockets(err); 
}) 
.on('result', function(order,callback) 
{ 
    order.abc ='11'; 
    order.OrderKOT=[]; 

    var queryOrderKOT = db.query('select * from tblorderkot where order_Id='+ order.order_Id,function() 
    { 

     kotOrders = []; 

     queryOrderKOT 
     .on('error',function(err) 
     { 
      console.log(err); 
      updateSocket(err); 
     }) 
     .on('result',function(orderKOT) 
     { 
      kotOrders.push(orderKOT); 
     })  
     .on('end', function() 
     { 
      console.log(kotOrders); 
      order.OrderKOT.push(kotOrders); 
     }); 
    }); 

    console.log(order); 
    users.push(order); 
    /* aa(function(){ 
    });*/ 
}) 
.on('end', function() 
{ 
    // loop on itself only if there are sockets still connected 
    if (connectionsArray.length) 
    { 
     pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL); 
     console.log("This is End Values"); 
     updateSockets({ users: users }); 
    } 
}); 

order.OrderKOT設置爲空。我知道這是在query.on(result)的回撥過程中完成的,但是如果我設定了它不會取得任何結果。第二個查詢queryOrderKOT正在工作,但它很晚才提取價值,並且不會將價值推向order.OrderKOT。建議我同時提取價值。

回答

0

經過這麼多的破解後,終於找到了併發mysql nodejs的解決方案,請檢查@kevin Reilly多謝了。我發現我們試過的是streaming query。這將是異步過程。現在回來我寫了下面的回調,它的工作完美

var query = db.query('select * from orderdish', function (err, results, fields, callback) { 
     if (err) { 
      console.log("ERROR: " + err.message); 
      updateSockets(err); 
     } 
     else { 
      // length of results 
      var count = 0; 
      // pass the db object also if you wanna use the same instance 
      q2(count, results, callback); 
     } 
    }); 


function q2(count, results, callbacks) { 
    var queryOrderKOT = db.query('select * from tblorderkot where order_Id=' + results[count].order_Id, function (err, resultKOT, KOTFields, callback) { 
     console.log(resultKOT); 
     results[count].OrderKOT = resultKOT; 
     count++; 
     if (count < results.length) { 
      q2(count, results, callback); 
     } 
     else { 
      // do something that you need to do after this 
      console.log(results); 

      //callbacks(results); 
     } 
    }); 
} 
0

第二個query的「結束」事件很可能在第二個queryOrderKot查詢有機會完成之前發生。

如果將主響應邏輯從query的「結尾」移動到queryOrderKot的「結束」或「結果」,您應該會體驗到預期的行爲。

+0

我試圖做同樣的移動'query.on(「端」,函數(){''到queryOrderKOT.on(「端」 ,函數()'但'query.on('end''根本不觸發 –

+0

什麼是客戶端?將它移入'result'應該可以工作 –

+0

它的mysql,並且在結果之後仍然移動,但它仍然沒有觸發。我嘗試了多個實際的組合。 –

0

這裏是我的全部代碼,

VAR的mysql =需要( 'MySQL的')

VAR IO =需要( 'socket.io')。聽(3000)

變種分貝= mysql.createConnection({

host: 'localhost', 

user: 'root', 

password: 'vsk', 

database: 'hahaha' }) 

變種POLLING_INTERVAL = 3000,
connectionsArray = [],
pollingTimer; db.connect(函數(ERR){

if (err) console.log(err) }) 

變種socketCount = 0, restID = 0;

變種pollingLoop =函數(){

變種查詢= db.query(」

.on('error', function(err) { 

    console.log(err); 
    updateSockets(err); 
}) 
.on('result', function(order) { 

    console.log("THis is USerID"+ order.order_Id); 
    order.abc ='11'; 
    order.OrderKOT=[]; 

    var queryOrderKOT = db.query('select * from tblorderkot where order_Id='+ order.order_Id); 

     kotOrders = []; 

     queryOrderKOT 
     .on('error',function(err){ 
      console.log(err); 
      updateSocket(err); 
     }) 
      .on('result',function(orderKOT){ 

       kotOrders.push(orderKOT); 
       query.on('end', function() { 
          console.log("This is at end values"); 
      // loop on itself only if there are sockets still connected 
      if (connectionsArray.length) { 
      pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL); 
      console.log("This is End Values"); 
      updateSockets({ 
      users: users 
      }); 
      } 
      }); 
      })  
      .on('end', function() { 
      console.log(kotOrders); 
       console.log("This is my KOT End"); 
        order.OrderKOT.push(kotOrders); 

        users.push(order); 
        console.log(users); 



          //callback(kotOrders); 
      }); 



     console.log(order); 


}); 

};從 orderdish'), 用戶= []選擇*

io.sockets.on('connection',function(socket){console.log(「New Connection Opened」); socket.on( 'restID',函數(restIDs){

 console.log(restIDs); 
     restID = restIDs; 

     console.log('Number of connections:' + connectionsArray.length);  if (connectionsArray.length > 0) { 
     console.log("Here is the Pooling Loop"); 
      pollingLoop();   } 



    }); 

    socket.on('disconnect', function() { 
     var socketIndex = connectionsArray.indexOf(socket); 
     console.log('socket = ' + socketIndex + ' disconnected'); 
     if (socketIndex >= 0) { 
     connectionsArray.splice(socketIndex, 1); 
     } 


    }); 

    connectionsArray.push(socket); 
    }); 

變種updateSockets =函數(數據){//加入最後 更新data.time =新日期的時間(); //發送新數據全部連接到連接的所有 套接字數組(tmpSocket){tffSocket}通知',數據);});};

最終,我試圖做套接字綁定和sql表ID在其他表上有依賴項ID。但是,自從我把結尾陳述搬進去以後,這讓我產生了空洞的結果。

+0

The 「queryOrderKOT」查詢的「結束」事件的內容可能需要移動到「結果」的頂部lt「該事件。這就是實際更新發生的地方,因此在您發送響應之前可能需要進行更新。 –

+0

由於從查詢中嵌套了「order.order_Id」,因此無法完成。嵌套是我面臨這個問題的地方。如果你以其他方式暗示我也會很有幫助。 –

+0

訂單對象應該由第一個查詢的所有內部函數繼承。 –