Node.js mysql查询for循环
node.js mysql query in a for loop
我有两个查询。
首先,
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)时,返回的数据落后一步。
假设我搜索"Tim",没有显示。
假设我搜索"芬兰"接下来是我关于"时间"的数据。出现了。
我怀疑这是因为我从checkedged函数中获取数据的方式。
我创建了一个新的顶级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函数过早地发送响应。
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.');
};
});
});
我的问题:
- 从异步函数发送数据的正确方法是什么?
- 有一些方法我可以让我的app.get或res.send等待,直到我的数据被检索发送之前?
编辑2:我可以通过把所有的代码在我的app.get()工作,但必须有一个更优雅,更容易阅读的解决方案?
在我看来,做到这一点的最好方法是使用一个名为async
的节点模块并行运行,并在一切完成时有一个回调。
对于这种情况,async
模块中定义了多种方法,我建议使用forEachOf
。
假设您的data
参数是一个数组,它是这样的-
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
}
});
}
它基本上做的是,它在你的data
数组上循环,并为该数组的每个元素运行查询。一旦执行了查询,它将调用该迭代的本地回调方法。一旦所有迭代完成(i。(最后一个本地回调被调用),它调用最后一个回调,当你所有的查询都完成执行后,你可以做任何你想做的事情。
更多关于forEachOf
的信息在这里- https://caolan.github.io/async/docs.html#eachOf
Async模块- https://caolan.github.io/async/
try this
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'pass',
database: 'db'
});
connection.connect(function(err)
{
if (err) throw err;
connection.query("SELECT * FROM tb", function (err, result, fields)
{
if (err) throw err;
var test = result;
var length = Object.keys(result).length;
console.log( length );
for (var i = 0; i < length; i++)
{
console.log(result[i].column_name);
};
});
});
如果您只是担心i
的作用域,以获得特定索引的值,只需使用array.forEach
。
data.forEach(function(datum, i){
var inserts = [datum['itemId'], datum['buyout']];
var ssql = mysql.format(sql, inserts);
datum['undercut'] = i;
connection.query(ssql, function(err, rows, fields){
...
datum['undercut'] = rows[0].cnt;
...
});
...
});
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记