【发布时间】:2021-08-31 01:05:24
【问题描述】:
我有两个问题。
第一个,
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 -> 'undercut'。
我的功能:
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”,没有任何显示。
假设我接下来搜索“Finn”,就会显示我在“Tim”上的数据。
我怀疑这是因为我从 checkUndercut 函数中获取数据的方式。
我创建了一个新的顶级变量 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() 中来使其工作,但必须有一个更优雅且更易于阅读的解决方案?
【问题讨论】:
-
您的第一个查询是什么?我问是因为非常最好将它们一起滚动到一个存储过程中,加入/子选择而不是对数据库进行多次来回(它几乎可以肯定地为你积累数据)。
-
第一个查询是这样的:'SELECTauctions.name, wowitemdata.itemName,auctions.itemId,auctions.buyout,auctions.quantity FROM
auctionsINNER JOINwowitemdataONuctions.itemId = wowitemdata.itemID ' 编辑:该死的格式
标签: javascript mysql node.js node-mysql