首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >node.js循环中的for mysql查询

node.js循环中的for mysql查询
EN

Stack Overflow用户
提问于 2016-10-13 20:13:10
回答 3查看 24.3K关注 0票数 5

我有两个问题。

第一,

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()。响应将作为新元素-> 'undercut‘添加到#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",什么也没有出现。

假设我接下来搜索"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.');
    };
    
    });
}); 

我的问题:

  1. 从异步函数中发送数据的正确方法是什么?
  2. 有没有什么方法可以让我的app.get或res.send等到检索到数据后再发送数据?

编辑2:我可以通过将所有代码放在我的app.get()中来让它工作,但必须有一个更优雅和更容易阅读的解决方案?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40020695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档