Nodejs повторяется в цикле перед выполнением вложенных в них запросов mysql - PullRequest
0 голосов
/ 17 февраля 2020

Я не могу вернуть массив projectIds после того, как операторы mysql завершили выполнение, поскольку l oop выполняет итерацию перед их выполнением. Это приводит к тому, что пустой массив возвращается каждый раз.

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);
}

1 Ответ

0 голосов
/ 17 февраля 2020

Вы пытаетесь выполнить код стиля обратного вызова в forEach, который не ожидает завершения запроса sh. Вот почему вы получаете массив эмоций. Я бы сделал несколько модификаций

  • Используйте обещанную версию метода query. Ознакомьтесь с документацией mysql узла пакета
  • Используйте for..of l oop вместо forEach.
  • Сделайте функцию async
  • Также await при Вы вызываете обещанную версию метода запроса.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...