繁体   English   中英

Nodejs 在执行嵌入其中的 mysql 查询之前循环迭代

[英]Nodejs loops iterating before executing the mysql queries embedded inside them

在 mysql 语句完成执行后,我无法返回 projectIds 数组,因为在执行它们之前循环正在迭代。 这导致每次都返回空数组。

function fetchProjects (projects, userId, callback) {
  projectIds = [];
    Object.keys(projects).forEach(function(key) {
      var row = projects[key];
      const sql = 'create table if not exists users_' + row.project_id + '(sno int primary key auto_increment, iteration_no int not null, user_id int not null, foreign key(iteration_no) references pro_' + row.project_id + '(iteration_no), foreign key(user_id) references user(user_id))';
      connection.query(sql, function(err, result) {
        if(err) {
          console.log(err.sqlMessage);
          return callback(err.sqlMessage, false);
        } else {
          // console.log("First statement executed");
          const sql1 = "select distinct t1.project_id, t1.project_name, t1.client, t1.initial_department_id, t1.start_date, t1.status, t1.current_department, t1.currently_assigned_user from project t1, users_" + row.project_id + " t2 where t1.project_id = '" + row.project_id + "' and (select user_id from users_" + row.project_id +" where user_id = " + userId + ")";
          connection.query(sql1, function(err, result1) {
            if(err) {
              console.log(err.sqlMessage);
              return callback(err.sqlMessage, false);
            } else {
              if(result1.length > 0) {
                console.log(result1);
                projectIds.push(result1);
              }
            }
          });
        }
      });
      // console.log("Iterating");
    });
    return callback(false, projectIds);
}

您正在尝试在forEach执行回调样式代码,该代码不等待查询完成。 这就是你得到 emoty 数组的原因。 我会做一些修改

  • 使用query方法的承诺版本。 查看mysql节点包的文档
  • 使用for..of循环而不是 forEach。
  • 使函数async
  • 当您调用查询方法的承诺版本时也await

希望这可以帮助。

暂无
暂无

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

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