我有兩個查詢。
第一,node.js mysql for循環查詢
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便宜的計數()。響應將作爲新元素添加到#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循環我VAR追加數據。
我該如何解決這個問題?
編輯: 我的新的問題:
當我搜索的域名(searchobj),返回的數據是落後一步。
說我搜索「蒂姆」,什麼都沒有出現。
說我接下來搜索「Finn」,我的關於「Tim」的數據出現了。
我懷疑這是因爲我從checkUndercut函數中獲取數據的方式。
我做了一個新的頂級變種,應用程序數據和使用@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.');
};
});
});
我的問題:
1什麼是發送數據了異步函數的正確方法是什麼?
2有什麼方法可以讓我的app.get或res.send等待直到我的數據在發送之前被檢索?
編輯2:我可以通過將所有代碼放在我的app.get()中來獲得它的工作,但是必須有更優雅和更易於閱讀的解決方案嗎?
什麼是你的第一個查詢?我問,因爲它非常適合將它們放在一起存儲過程,加入/再選擇,而不是多次來回數據庫(它幾乎可以爲你積累數據)。 – msanford
第一個查詢是這樣的: 'SELECT auctions.name,wowitemdata.itemName,auctions.itemId,auctions.buyout,auctions.quantity FROM'auctions' INNER JOIN'wowitemdata' ON auctions.itemId = wowitemdata.itemID' 編輯:該死的格式化 – user45706