Node.js for循环中的mysql查询

2024-02-26

我有两个疑问。
首先,

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 函数获取数据的方式所致。
我创建了一个新的顶级 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并行运行事物并在一切完成时进行一次回调。

定义了多种方法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数组并对该数组的每个元素运行查询。执行查询后,它会调用该迭代本地的回调方法。一旦所有迭代完成(即调用最后一个本地回调),它就会调用最终回调,您可以在所有查询执行完毕后在其中执行您想要执行的任何操作。

更多关于forEachOf here - https://caolan.github.io/async/docs.html#eachOf https://caolan.github.io/async/docs.html#eachOf

异步模块 -https://caolan.github.io/async/ https://caolan.github.io/async/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js for循环中的mysql查询 的相关文章

随机推荐

  • Openwhisk:增加并发请求数

    我有一个分布式 Openwhisk 设置 当我尝试一次向一个用户执行 30 多个请求时 出现以下错误 错误 无法调用操作 素数 并发数太多 正在处理的请求 计数 30 允许 30 知道如何增加这个数字吗 如果您使用 ansible 方法部署
  • 计算机图形学:光线追踪和 3D 渲染编程

    我注意到许多顶尖大学都为计算机专业的学生提供与计算机图形学相关的课程 遗憾的是 这是我的大学没有提供的东西 也是我非常想在未来几年内进入的东西 我从一些大学发现的一些项目都很棒 尽管我最感兴趣的是两件事 Raytracing 我想在未来两年
  • google chrome实现了哪个版本的websockets协议草案

    我正在尝试在 java 中实现 websockets 服务器 但我无法理解 google chrome 实现的 websocket 协议版本 在this http blog chromium org search label websock
  • XSLT 有数组的概念吗?

    我以前从未真正使用过 XSLT 正在寻求一些建议 我从 GSA 箱中以 XML 形式返回了以下项目
  • SQL 搜索和替换

    不可否认 对于 SQL 命令我是个菜鸟 一名黑客在我的 WordPress 网站上的每个帖子和页面的末尾插入了一个脚本标签 我试图在 wp posts 表中进行查找和替换 但当我运行模拟查询 这是我所拥有的 UPDATE wp posts
  • HTTP 动词 - 何时使用 GET/POST/PUT/Delete

    当您从事 RESTFUL 服务时 您经常会听到这些术语GET POST PUT DELETE 我的问题是这么多动词背后的想法是什么 我可以在以下人的帮助下实现一切GET动词或者如果我想在消息正文中发布一些大数据 我可以使用POST动词 我认
  • 从 Rails 生成 PDF

    The Ruby On Rails Wiki 列出了几个库 http wiki rubyonrails org rails pages HowtoGeneratePDFss 促进PDF一代在Rails 我需要打印地址标签 以字母格式 因此每
  • 如何为 VisualVM“<未知应用程序>”命名?

    JDK 1 6 捆绑了一个名为 VisualVM 的便捷工具 可让您检查正在运行的 Java 进程并与之交互 其中一项功能是它会自动检测本地计算机上正在运行的 JVM 大多数被列为 pid xxxx 但有些有名称和图标 例如 VisualV
  • REGEXP_EXTRACT(word,r'(\w\w\'\w\w)') 中 r 的含义是什么

    我在 BigQuery 中都找不到答案参考 https cloud google com bigquery query reference regularexpressionfunctions or re2 wiki https code
  • 如何获取 PyObject 的引用计数?

    如何获取a的引用计数PyObject来自 C 有功能Py INCREF and Py DECREF增加 减少它 但我还没有找到任何返回对象引用计数的函数 我需要它用于调试目的 每个对象的引用计数都存储在PyObject本身 在一个名为的变量
  • 同时创建新文件[重复]

    这个问题在这里已经有答案了 为了创建一个新的 唯一的文件名 我使用以下代码 File file new File name synchronized sync int cnt 0 while file exists file new Fil
  • 对于动态元素,scroll() 在 jQuery 中不起作用

    我正在使用以下内容 这不适用于动态创建的元素 我正在使用 jQuery 1 4 2 wrapper1 live scroll function alert 123 wrapper2 scrollLeft wrapper1 scrollLef
  • 净::ERR_INCOMPLETE_CHUNKED_ENCODING

    我使用 htaccess 将 URL 从 someurl com 重写为 someurl com public www 根目录中的第一个 htaccess 包含以下内容 DirectoryIndex public RewriteEngine
  • 交替组合两个等长向量[重复]

    这个问题在这里已经有答案了 我在挣扎 我觉得必须有一种很好的矢量化方法来做到这一点 但我只是没有找到它 我目前有两个等长的向量 我想将它们组合起来 但我想要向量 1 中的第一个元素 然后是向量 2 中的第一个元素 然后是向量 1 中的第二个
  • Django:模型上次修改日期和修改数量

    我有一个名为的 django 模型Blog 我想在当前模型中添加一个用于 last modified date 的字段 我知道如何设置默认值 但我希望它能够在我通过管理界面修改博客条目时自动更新 有没有某种方法可以强制将此值设置为每个管理站
  • 选择单列中的多行,以换行符分隔

    我有一个表 其值如下所示 Id Name Fruit 1 Jon Apple 2 Jon Orange 3 Jon Grape 4 Mike Apple 5 Mike Orange mysql中如何将列区分为类似这样的内容 Name Fru
  • JSX:内联条件属性 [href]

    我正在 jsx 中寻找 Href 属性的内联条件解决方案 如果我提供网址 我想输出 a href example url Logo a 如果不 a Logo a 最简单的解决方案 React 删除值为以下的属性undefined or nu
  • 范围输入跑步者进度填充颜色

    I m working with the range input here I m trying to add color to the slider thumb before I had tried using background gr
  • PartialView 作为字符串 + JsonResult

    我只是在寻找一种好方法 如何从服务器返回 JSON 对象 其中包含部分视图的 html 和一些附加数据 如果需要 我在用着蒂姆 斯科特的方法 https stackoverflow com questions 483091 render a
  • Node.js for循环中的mysql查询

    我有两个疑问 首先 SELECT auctions name wowitemdata itemName auctions itemId auctions buyout auctions quantity FROM auctions INNE