繁体   English   中英

Node.js 中的同步 mysql

[英]Synchronous mysql in Node.js

我知道 node.js 是事件驱动的,我应该异步执行此操作,但我想不出办法。

所以,我有这个

var querystr = "SELECT * FROM groups";
    var result = "";
    dbClient.query(querystr, function (err, res, fields) {
        if (err) {
            console.log(err);
            return;
        }
        for(var i in res) {
            result = result + "@" +res[i].name + " =";
            for (var j in res[i].members.split(",")) {
                var memberquery;
                if (j.substr(0,1) == "@") {
                    memberquery = "SELECT name FROM groups WHERE id = "+j.substr(1, j.length-1);
                } else {
                    memberquery = "SELECT username FROM users WHERE id= "+j;
                }
                dbClient.query(memberquery, function(err, memres, fields) {
                    var membername = "";
                    if (typeof memres[0].username == "undefined") {
                        membername = "@"+memres[0].name;
                    } else {
                        membername = memres[0].username;
                    }
                    result = result + " " + membername; 
                });

            }
            result = result + "\n"; 
        }
    });

使其同步的问题是 for inside。 基本上我在结果变量中生成一个文档,我在其中检查组并告诉成员,所以预期的 output 是

Group1 = member, member
Group2 = member, member

对于这类问题,我通常使用如下所示的模式。 简而言之:获取事物列表,然后调用 function 来处理列表; function 调用自身,直到列表完成; 在累加器中收集 go 的结果; 当列表为空时,返回您通过回调累积的任何内容。 这只是完成@Andrey Sidorov 在他的回复中所展示的另一种方式。

//cb is (err, res) 
function getData(cb){
  var querystr = "SELECT * FROM groups";
  var result = "";

  dbClient.query(querystr, function (err, res, fields) {
      if (err)
          cb(err);
      else {
        var groups = [];
        for (var ndx in res)
          groups = groups.concat(res[ndx].members.split(","));

        getMembers(groups, [], cb);
      }
  });
}

function getMembers(members, sofar, cb){
  var member = members.shift();

  if (!member)
    cb(null, sofar);
  else {
    var memberquery;
    var params;

    if (member.substr(0,1) == "@") {
        memberquery = "SELECT name FROM groups WHERE id = ?";
        params = [member.substr(1, member.length-1)];
    } else {
        memberquery = "SELECT username FROM users WHERE id = ?";
        params = [member];
    }

    dbClient.query(memberquery, params, function(err, res) {
      if (err)
        cb(err);
      else {
        var membername = "";
        if (typeof res[0].username == "undefined") {
            membername = "@" + res[0].name;
        } else {
            membername = res[0].username;
        }

        sofar.push(membername);

        getMembers(members, sofar, cb);
      }
    });
  }
}
function do_queries( resultCallback )
{
    var querystr = "SELECT * FROM groups";
    var result = "";
    var num_queries_left = 0;
    dbClient.query(querystr, function (err, res, fields) {
        if (err) {
            console.log(err);
            return;
        }

        // calculate number of invocations of second sub-query
        for(var i in res)
            num_queries_left += res[i].members.split(",").length;

        for(var i in res) {
            result = result + "@" +res[i].name + " =";                 
            for (var j in res[i].members.split(",")) {
                var memberquery;
                if (j.substr(0,1) == "@") {
                    memberquery = "SELECT name FROM groups WHERE id = "+j.substr(1, j.length-1);
                } else {
                    memberquery = "SELECT username FROM users WHERE id= "+j;
                }
                dbClient.query(memberquery, function(err, memres, fields) {
                    var membername = "";
                    if (typeof memres[0].username == "undefined") {
                        membername = "@"+memres[0].name;
                    } else {
                        membername = memres[0].username;
                    }
                    result = result + " " + membername;
                    num_queries_left--;
                    if (num_queries_left == 0)
                    {
                        resultCallback(result);
                        return;
                    } 
                });

            }
            result = result + "\n"; 
        }
    });
}


do_queries( function(result) {
    console.log(result);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM