Node.Js mysql исключение только в первый раз - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема с приложением node.js, которое я написал, оператор SQL работает только при первом выполнении, а функция после оператора никогда не запускается.

Есть нет ошибок, когда я запускаю приложение, и оно запускается, даже когда запрос не выполняется.

Эта функция работает только при первом запуске:

var sqlEntfernen = async function(id) {
  return new Promise(function(resolve) {
    var statement3 = 'DELETE FROM `table` WHERE `table`.`column` = ' + id;
    console.log('1'); //this gets fired every time the function is executed
    connection.query(statement3, async function(error3, results3, fields3) {
      console.log(results3.affectedRows + ""); //this never gets fired
      if (error3) {
        resolve(0);
      } else {
        if (results3.affectedRows > 0) {
          resolve(1);
        } else {
          resolve(0);
        }
      }
    });
  })
}

Вот код, который выполняется в for l oop:

sqlEntfernen(userid).then(function(statusCode) {
     if (statusCode == 0) {
         console.log("\x1b[41m%s\x1b[0m", 'Fehler beim Löschen aus der Datenbank!'); //never gets fired
     } else if (statusCode == 1) {
         console.log("\x1b[45m%s\x1b[0m", 'Der Benutzer mit der Benutzer_ID ' + id + ' wurde aus der Inventur entfernt!'); //never gets fired
     }
});

Понятия не имею, почему этот запрос работает только в первый раз.

Надеюсь на вашу помощь.

Заранее спасибо, Патрик

EDIT:

var mysql = require('mysql');
var connection = mysql.createConnection({
  user: 'username',
  password: 'password',
  host: '127.0.0.1',
  database: 'database'
});
Object.size = function(obj) {
  var size = 0,
    key;
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
  }
  return size;
};


var sqlEntfernen = async function(id) {
  return new Promise(async function(resolve) {
    var statement3 = 'DELETE FROM `benutzer` WHERE `benutzer`.`Benutzer_ID` = ' + id;
    console.log(statement3); //this gets fired every time the function is excecuted
    connection.query(statement3, async function(error3, results3, fields3) {
      console.log(results3.affectedRows + "");
      if (error3) {
        resolve(0);
      } else {
        if (results3.affectedRows > 0) {
          resolve(1);
        } else {
          resolve(0);
        }
      }
    });
  })

}


var benutzerLoeschen = async function(mandant) {
  return new Promise(async function(resolve) {
    var benutzerArray;
    var benutzerArrayinventur;
    var statement = 'SELECT `benutzer`.`Benutzer_ID` FROM `benutzer`';
    connection.query(statement, async function(error, results, fields) {
      if (error) {
        console.log("\x1b[41m%s\x1b[0m", 'Fehler beim auslesen der Datenbank "benutzer"!');
      } else {
        benutzerArray = results;
        console.log("\x1b[42m%s\x1b[0m", 'Die Datenbank "benutzer" wurde erfolgreich ausgelesen!');
      }


    });
    setTimeout(function() {
      var statement2 = 'SELECT `objekte`.`Benutzer_ID` FROM `objekte`';
      connection.query(statement2, async function(error2, results2, fields2) {
        if (error2) {
          console.log("\x1b[41m%s\x1b[0m", 'Fehler beim auslesen der Datenbank "objekte"!');
        } else {
          benutzerArrayInventur = results2;
          console.log("\x1b[42m%s\x1b[0m", 'Die Datenbank "objekte" wurde erfolgreich ausgelesen!');
        }


      });

      console.log("\x1b[44m%s\x1b[0m", "Startvorgang...");
    }, 100);
    var status = false;
    setTimeout(function() {
      for (let i = 0; i < Object.size(benutzerArray); i++) {
        for (let i2 = 0; i2 < Object.size(benutzerArrayInventur); i2++) {
          if (benutzerArray[i].Benutzer_ID == benutzerArrayInventur[i2].Benutzer_ID) {
            status = true;
            i2 = Object.size(benutzerArrayInventur) - 1;
          }

          if (i2 == (Object.size(benutzerArrayInventur) - 1)) {
            if (status) {
              console.log("\x1b[42m%s\x1b[0m", 'Der Benutzer mit der Benutzer_ID ' + benutzerArray[i].Benutzer_ID + ' wird noch in der Inventur verwendet!');
              status = false;
            } else {
              console.log("\x1b[43m%s\x1b[0m", 'Der Benutzer mit der Benutzer_ID ' + benutzerArray[i].Benutzer_ID + ' wird nichtmehr in der Inventur verwendet!');
              sqlEntfernen(benutzerArray[i].Benutzer_ID).then(function(statusCode) {
                if (statusCode == 0) {
                  console.log("\x1b[41m%s\x1b[0m", 'Fehler beim löschen aus der Datenbank!');
                } else if (statusCode == 1) {
                  console.log("\x1b[45m%s\x1b[0m", 'Der Benutzer mit der Benutzer_ID ' + id + ' wurde aus der Inventur entfernt!');
                }
              });
            }
            if (i == (Object.size(benutzerArray) - 1)) {
              setTimeout(function() {
                resolve('Bereinigung abgeschlossen!');
              }, 100);
            }
          }
        }
      }
    }, 10000);
  });

}


benutzerLoeschen().then(function(message) {
  console.log("\x1b[44m%s\x1b[0m", message);
  setTimeout(function() {
    process.exit();
  }, 10000);
});

EDIT2: NodeJs log

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Я не знаю почему, но я обнаружил, что операторы sql выполняются после того, как мой код завершен. StatusCode также возвращается в конце кода. Так что он работает, даже я не понимаю, почему оператор выполняется в конце.

0 голосов
/ 18 июня 2020

Я думал, что mysql ожидает обычную функцию как обратный вызов, а с asyn c function ... вы технически предоставляете Promise. Я бы попытался удалить asyn c из обратного вызова:

connection.query(statement3, function(error3, results3, fields3) { 
...