并发访问多表Mysql节点
我试图从两个表中分配一个结构化数组,第一个表选择查询,结果中的值从中获取ID,然后分配到下一个查询,下面是我的代码并发访问多表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) {
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对象应该由第一个查询的所有内部函数继承。