【问题标题】:Access Multiple table concurrently Mysql Nodejs同时访问多个表Mysql Nodejs
【发布时间】:2014-02-25 07:03:29
【问题描述】:

我正在尝试从两个表中分配结构化数组,第一个表选择查询,结果中的值从中获取 ID 并分配给下一个查询,这是我的代码

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。建议我同时获取值。

【问题讨论】:

    标签: mysql node.js concurrency


    【解决方案1】:

    第一个query 的“结束”事件很可能在第二个queryOrderKot 查询有机会完成之前发生。

    如果您将主要响应逻辑从query 的“结束”移动到queryOrderKot 的“结束”或“结果”,您应该会遇到预期的行为。

    【讨论】:

    • 我尝试将query.on('end', function(){ 移动到queryOrderKOT.on('end', function()query.on('end' 根本没有触发。
    • 什么是客户端?将其移至 result 应该可以工作
    • 它的mysql,并且在结果之后仍然移动,它仍然没有触发。事实上,我尝试了多种组合。
    • 具体的 MySQL node.js 客户端是什么?我只是想看看自述文件。您能否根据此建议更新您的代码或使用您认为应该工作的新答案?
    【解决方案2】:

    经过这么多的脑筋急转弯终于找到了并发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);
            }
        });
    }
    

    【讨论】:

      【解决方案3】:

      这是我的整个代码,

      var mysql = require('mysql')
      var io = require('socket.io').listen(3000)
      var db = mysql.createConnection({
          host: 'localhost',
          user: 'root',
          password: 'vsk',
          database: 'hahaha'
      })
      
      var POLLING_INTERVAL = 3000, connectionsArray = [], pollingTimer;
      db.connect(function (err) {
          if (err) console.log(err)
      })
      
      var socketCount = 0, restID = 0;
      
      var pollingLoop = function () {
          var query = db.query('select * from orderdish'), users = [];
      .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);
          });
      };
      
      io.sockets.on('connection', function (socket) {
          console.log("New Connection Opened");
          socket.on('restID', function (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);
      });
      var updateSockets = function (data) { // adding the time of the last update data.time = new Date(); 
          // sending new data to all the sockets connected connectionsArray.forEach(function(tmpSocket) {
          // tmpSocket.volatile.emit('notification', data); console.log(data); tmpSocket.volatile.emit('notification', data); }); };
      

      【讨论】:

      • queryOrderKOT 查询的“结束”事件的内容可能需要移动到该查询的“结果”事件的顶部。那是实际更新发生的地方,所以它可能需要在您发送响应之前发生。
      • 由于order.order_Id 是从查询中嵌套的,因此无法完成。嵌套是我面临这个问题的地方。如果您建议我采取其他方式,那也将非常有帮助。
      • 订单对象应该被第一个查询的所有内部函数继承。
      猜你喜欢
      • 2017-03-14
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多