nodejs mysql как закрыть соединение после того, как al oop ввел данные в дб - PullRequest
0 голосов
/ 06 марта 2020

У меня есть довольно простая программа, которая собирает данные из aws, используя aws -cli и nodejs, а затем вводит их в MySQL. Чтобы быть честным, это работает, единственное, что я хотел бы, чтобы эта программа была запланирована для запуска время от времени, но я не могу, поскольку она не выходит: когда все данные были введены, я не прекращаю соединение. Я попытался выяснить, как это сделать (закрыть / завершить соединение с MySQL) с обещаниями и асинхронно / безуспешно. Конечно, что-то я не делаю правильно (до сих пор трудно понять концепцию обещаний и асинхронного программирования), но все же пытался целыми днями.

[...]

    function insertInstanceDetails(date, zone, instance_id, name){
        let insert_details = "INSERT INTO instances (date, zone, instance_type, name) VALUES(" + db.escape(date) + "," + db.escape(zone) + "," + db.escape(instance_id) + "," + db.escape(name) + ")";
        db.query(insert_details, function(err, result){
            if(err) throw err;
        });
        return;
    }                                                                                                                                                                                                            

    for(instance-id of instance-ids){

        aws.command('ec2 describe-instaces .....').then(function (data) {
            var result = JSON.parse(data.raw); 

            for (var key in result.xyz) { 
                insertInstanceDetails(.......);
            }   
        });
    }

Спасибо за помощь. ; -)

1 Ответ

0 голосов
/ 06 марта 2020

Один из способов отслеживания выполнения функции insertInstanceDetails - это также преобразовать ее в обещание.

function insertInstanceDetails(date, zone, instance_id, name) {
  return new Promise((resolve, reject) => {
    let insert_details = "INSERT INTO instances (date, zone, instance_type, name) VALUES(" + db.escape(date) + "," + db.escape(zone) + "," + db.escape(instance_id) + "," + db.escape(name) + ")";
    db.query(insert_details, function(err, result) {
      if (err) return reject(err);
    });
    return resolve(result);
  });
}

А что касается for..of l oop, он будет действовать как обработчик обещаний, и как только он узнает, что вся работа SQL выполнена, он будет закройте соединение SQL как можно скорее

for (instance - id of instance - ids) {

  aws.command('ec2 describe-instaces .....').then(function(data) {
    var result = JSON.parse(data.raw);
    const insertInserteDetailsJobs = [];
    for (var key in result.xyz) {
      insertInstanceDetailsJobs.push(insertInstanceDetails(.......));
    }
    // Handle, and watch over all those micro-promise
    return Promise.all(insertInstanceDetailsJobs);
  })
  .then(sqlResults => {
    // Now we know all the insert details has beeing successfully inseted into your DB
    // We can now close the SQL connection safely
    ...
    myDB.close();
  })
  .catch(err => {
    // Something fail
    console.error(err);
  });
}
...