Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并发访问多表Mysql节点_Mysql_Node.js_Concurrency - Fatal编程技术网

并发访问多表Mysql节点

并发访问多表Mysql节点,mysql,node.js,concurrency,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) {

我试图从两个表中分配一个结构化数组,第一个表选择查询,结果中的值从中获取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.onresult中使用callback来完成,但如果我设置了它,则不会获取任何结果。第二个查询queryOrderKOT正在工作,但它获取值的时间很晚,而且它没有将值传递给order.OrderKOT。建议我同时获取值。

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


如果将主响应逻辑从查询的结尾移动到queryOrderKot的结尾或结果,您应该会体验到预期的行为。

以下是我的全部代码

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

经过这么多的努力,终于找到了并发mysql nodejs检查的解决方案@kevin Reilly感谢您的努力。我发现我们试过的都是些什么。这将使进程异步。现在回到我写的回调,它工作得很好

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

我也尝试了同样的方法来移动查询。在“end”上,函数{to queryOrderKOT.on'end',function but query.on'end'根本不会触发。客户端是什么?将其移动到结果中应该可以工作mysql,并且在结果之后仍然移动它也不会触发。事实上,我尝试了多种组合。什么特定的mysql node.js客户端?我只是想查看自述。你能更新你的代码或mak吗e根据此建议,请提供一个新的答案,其中包含您认为应该有效的内容?queryOrderKOT查询的结束事件的内容可能需要移动到该查询的结果事件的顶部。这就是实际更新发生的地方,因此可能需要在您发送响应之前进行。由于顺序不同,无法执行此操作.order_Id,它是从查询中嵌套的frest。嵌套是我面临的问题。如果您建议我其他方法,它也会非常有用。order对象应该由第一个查询的所有内部函数继承。