同时访问多个表Mysql Nodejs

时间:2014-02-25 07:03:30

标签: mysql node.js concurrency

我正在尝试从两个表中分配结构化数组,第一个表选择查询,结果中的值获取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。建议我同时获取值。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这是我的整个代码,

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); }); };

答案 2 :(得分: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);
        }
    });
}