javascript – for循环中的node.js mysql查询
作者:互联网
我有两个问题.
首先,
SELECT auctions.name, wowitemdata.itemName, auctions.itemId,
auctions.buyout, auctions.quantity
FROM auctions
INNER JOIN wowitemdata ON auctions.itemId = wowitemdata.itemID;
返回这样的数据:
{
name: 'somename',
itemName: 'someitemname',
itemId: '0000',
buyout: '0001',
quantity: '5',
}
第二个查询使用来自#1的数据来获得比itemId便宜的项目的count().响应将作为新元素添加到#1 – > “削弱”.
我的功能:
function checkUndercut(data, length){
var Select = 'SELECT COUNT(auctions.itemId) AS cnt ';
var From = 'From `auctions` ';
var Where = 'WHERE auctions.itemId LIKE ? AND buyout < ?';
var sql = Select + From + Where;
for(i = 0, len = length; i < len; i++){
var inserts = [data[i]['itemId'], data[i]['buyout']];
var ssql = mysql.format(sql, inserts);
data[i]['undercut'] = i;
connection.query(ssql, function(err, rows, fields){
if(!err){
console.log("check Undercut: " + rows[0].cnt);
data[i]['undercut'] = rows[0].cnt;
} else {
console.log("Error while performing Query");
};
});
};
}
由于查询的异步性质,我不能使用for循环i var来追加数据.
我该如何解决这个问题?
编辑:
我的新问题:
当我搜索名称(searchobj)时,返回的数据落后一步.
说我搜索“蒂姆”,没有任何显示.
说我接下来搜索“Finn”,我的“Tim”数据显示出来.
我怀疑这是因为我从checkUndercut函数中获取数据的方式.
我创建了一个新的顶级var,appdata,并在使用了@simple_programmers建议后,我把我的新代码放到这样:
function(err){
if(err){
//handle the error if the query throws an error
}else{
appdata = data;
console.log(appdata);
//whatever you wanna do after all the iterations are done
}
});
console.log发出正确的信息所以我的问题在于get函数过早地发送响应.
我的获取功能:
app.get('/test',function(req, res) {
console.log("app.get "+searchobj);
var sqlSELECT = 'SELECT auctions.name, wowitemdata.itemName, auctions.itemId, auctions.buyout, auctions.quantity ';
var sqlFROM = 'FROM `auctions` ';
var sqlINNER ='INNER JOIN `wowitemdata` ON auctions.itemId = wowitemdata.itemID ';
var sqlWHERE = 'WHERE auctions.name LIKE ?';
var sql = sqlSELECT + sqlFROM + sqlINNER + sqlWHERE;
var inserts = [searchobj];
var sql = mysql.format(sql, inserts);
//console.log("Query: "+sql);
connection.query(sql, function(err, rows, fields) {
if (!err){
var rowLen = rows.length;
checkUndercut(rows, rowLen);
console.log(appdata);
res.send(appdata);
} else {
console.log('Error while performing Query.');
};
});
});
我的问题:
1从异步函数发送数据的正确方法是什么?
2有没有什么方法可以让我的app.get或res.send等到我的数据被检索后再发送?
编辑2:我可以通过将所有代码放在我的app.get()中来实现它,但必须有一个更优雅,更容易阅读的解决方案吗?
解决方法:
在我看来,最好的方法是使用一个名为async的节点模块来并行运行并在一切结束时进行一次回调.
在这种情况下,异步模块中定义了各种方法,我建议的方法是forEachOf.
鉴于您的数据参数是一个数组,它是这样的 –
function checkUndercut(data, length){
var Select = 'SELECT COUNT(auctions.itemId) AS cnt ';
var From = 'From `auctions` ';
var Where = 'WHERE auctions.itemId LIKE ? AND buyout < ?';
var sql = Select + From + Where;
async.forEachOf(data, function (dataElement, i, inner_callback){
var inserts = [dataElement['itemId'], dataElement['buyout']];
var ssql = mysql.format(sql, inserts);
dataElement['undercut'] = i;
connection.query(ssql, function(err, rows, fields){
if(!err){
console.log("check Undercut: " + rows[0].cnt);
dataElement['undercut'] = rows[0].cnt;
inner_callback(null);
} else {
console.log("Error while performing Query");
inner_callback(err);
};
});
}, function(err){
if(err){
//handle the error if the query throws an error
}else{
//whatever you wanna do after all the iterations are done
}
});
}
所以基本上做的是,它遍历你的数据数组并运行该数组的每个元素的查询.执行查询后,它会调用该迭代的本地回调方法.完成所有迭代后(即调用最后一个本地回调),它会调用最终回调,在执行完所有查询后,您可以在其中执行任何操作.
更多关于forEachOf的信息 – https://caolan.github.io/async/docs.html#eachOf
异步模块 – https://caolan.github.io/async/
标签:javascript,mysql,node-js,node-mysql 来源: https://codeday.me/bug/20190727/1553740.html