我的NodeJS MySQL Query函数总是返回错误结果

时间:2019-04-01 16:36:45

标签: javascript mysql node.js npm mysql2

我正在开发一个游戏,该游戏将MySQL用于多人游戏。现在,每次我请求查询时(例如

dat("SELECT * FROM server1;"); 

它不会给我server1的数据,而是返回

的结果
dat("SELECT * FROM highscore;");

即使我尝试其他命令,例如

dat("SELECT * FROM playernames;");

)。因此,我的函数似乎可以自动保存从一开始就执行的初始化查询,并在每次使用该函数时执行该查询。

我尝试在网络上搜索新功能,尝试了Promise,但是我是新手,我无法处理承诺,我不知道如何处理它们,所以我使用了异步和等待

async function dat(Befehl) {
  console.error(Befehl);
  con.connect(function(err) {
    if (err) throw err;
    console.log("MySQL: Connected to localhost!");
    con.query("USE abschlussprojekt;", function (err, result) {
      if (err) throw err;
      console.log(result);
    });
  });
  con.query(Befehl, function (err, result) {
    if (err) throw err;
    //await Sleep(10);
    while(result == undefined)
    {}
    temp = result;
    delete result;
  });
  return temp;
  con.close();
}

所以

let x = await dat("SELECT * FROM server1;"); 

我希望:

Player1Cards = "Cards"
Player1CardsColour = "Colour";
Player2Cards = "Cards";
Player2CardsColour = "Colour";
Player1Name = "Name"
Player2Name = "Name"

但是相反,它将返回高分表,我不知道为什么。

但是!!!当我重复调用相同的函数时,我可能会得到真实的结果。就像我打电话3-6次之后一样。

这里的功能也使用查询。

async function generateTable()
{
  let highscoredata = [];
  //await Sleep(3000);
   highscoredata = await loadhighscore();
   while(highscoredata === undefined)
   {
     highscoredata = await loadhighscore();
     await Sleep(10);
   }
   //else {

    console.log(highscoredata);

    if (gen>0) {
      await Sleep(500);
      gen--;
      generateTable();
    }
    else {
      var Spielername = [];
      var Spiel = [];
      var Highscore = [];
      await Sleep(100);
      for (var i = 0; i < highscoredata.length; i++) {
        Spielername[i] = highscoredata[i].Name;
        Spiel[i] = highscoredata[i].Spiel;
        Highscore[i] = highscoredata[i].Highscore;
        if (CONLOG) {
          console.log("SpielerName: "+Spielername);
        }
      }

      console.log("Daten implementiert");
      let table = document.getElementById("table");
      document.getElementById("table").innerHTML = "";
      var row, SpielerID1 = [], SpielerName1 = [], SpielArt1 = [], Highscore1 = [];
      for( var i = Spielername.length-1; i>-1; i--)
      {
        //console.log(Spielername);
        //console.log(i);
        row = await table.insertRow(0); //TR Element Neue Spalte

        SpielerID1[i] = await row.insertCell(0); //SpielerID
        SpielerName1[i] = await row.insertCell(1); //SpielerName
        SpielArt1[i] = await row.insertCell(2); //Spiel
        Highscore1[i] = await row.insertCell(3); //Score

        SpielerID1[i].innerHTML = i;
        SpielerName1[i].innerHTML = Spielername[i];
        SpielArt1[i].innerHTML = Spiel[i];
        Highscore1[i].innerHTML = Highscore[i];

      }
      //console.log(SpielerName);
      row = await table.insertRow(0);
      var stdID = await row.insertCell(0); //SpielerID
      var stdSN = await row.insertCell(1); //SpielerName
      var stdSP = await row.insertCell(2); //Spiel
      var stdSC = await row.insertCell(3); //Score

      stdID.innerHTML = "ID";
      stdSN.innerHTML = "Spieler";
      stdSP.innerHTML = "Spiel";
      stdSC.innerHTML = "Score";
    }

一项出于调试原因清除所有服务器的功能

function AlleFreigeben()
{
  dat("UPDATE INUSE SET Server1 = FALSE;");
  dat("UPDATE INUSE SET Server2 = FALSE;");
  dat("UPDATE INUSE SET Server3 = FALSE;");
  dat("UPDATE INUSE SET Server4 = FALSE;");
  dat("UPDATE INUSE SET Server5 = FALSE;");
  console.warn("Alle Server wurden wieder freigegeben!");
}

这里还有一个登录功能。

async function prelogin()
{

  preuser = await dat("SELECT * FROM users;"); //Everytime, this function is executed, it gets the results from the wrong table, so just ONE execution
  login(preuser);
}

async function login(user)
{
  preuser = await dat("SELECT * FROM users WHERE username = '"+document.getElementById("usernameinput").value+"';");
  console.warn(preuser);
if (preuser[0].password == await md5(document.getElementById("passwordinput").value)) {
  console.warn("Passwort korrekt");
  alert("Login erfolgreich");
  isUserLoggedIn = true;
  document.getElementById("Spieler1NameFeldHM").value = preuser[0].username;
  reverse(true);
  CPUTable();
}
else {
  alert("Falsches Passwort");
  console.error("Passwort falsch");
}
}

当然还有注册功能

async function register()
{
  if (document.getElementById("usernameinput").value == "") {
    alert("Geben Sie einen Benutzernamen ein");
  }
  else if (document.getElementById("usernameinput").value.length <3) {
    alert("Der Nutzername darf nicht weniger als 3 Zeichen haben")
  }
  else if (document.getElementById("usernameinput").value == "root") {
    alert("Ey, ich bin schon Admin");
  }
  else {
    let dbuser = await dat("SELECT * FROM users WHERE username = '"+document.getElementById("usernameinput").value+"';");
    console.log(dbuser);
    if (dbuser.length != 0) {
      if (document.getElementById("usernameinput").value == dbuser[0].username) {
        console.error(document.getElementById("usernameinput").value);
        console.error(await dat("SELECT * FROM users WHERE username = '"+document.getElementById("usernameinput").value+"';"));
        alert("Benutzername ist bereits vergeben");
      }
    }

    else {
      await dat("INSERT INTO users VALUES('"+document.getElementById("usernameinput").value+"', '"+md5(document.getElementById("passwordinput").value)+"');");
      alert("Registrierung erfolgreich!");
      prelogin();
    }
  }
}

这里是将名称推入表格并开始游戏的功能。

async function UnoStartHM()
{
  await dat("UPDATE spielernamen SET Spieler1 = '"+document.getElementById("Spieler1NameFeldHM").value+"';");
  await dat("UPDATE spielernamen SET Spieler2 = '"+document.getElementById("Spieler2NameFeldHM").value+"';");
  location.href = "./Uno.html";
}

但是,这是除手动mysql查询执行(通过控制台)之外不起作用的唯一功能

async function Abfrage()
{
  if (confirm("Möchtest du im lokalen Multiplayer spielen?")) { //If local multiplayer is confimed
    Multiplayer = true;
    myEmitter.setMaxListeners(100);
    console.log(myEmitter);
    let SpielerNamen = await dat("SELECT * FROM spielernamen");
    //Spieler1Name = SpielerNamen[0]
    Server1 = await dat("SELECT * FROM INUSE;");
    // Server1 = await dat2("SELECT * FROM INUSE;");
    // Server1 = await dat2("SELECT * FROM INUSE;");
    //Erzeuge Tabelle, falls sie noch nicht existiert!
    await dat("CREATE TABLE IF NOT EXISTS INUSE (Server1 boolean NOT NULL, Server2 boolean NOT NULL, Server3 boolean NOT NULL, Server4 boolean NOT NULL, Server5 boolean NOT NULL);");
    await Sleep(100);
    // await dat("INSERT INTO INUSE VALUES (FALSE, FALSE, FALSE, FALSE, FALSE);");
    await dat_alt();
    //await dat(" UPDATE INUSE SET Server2 = FALSE WHERE INUSE.Server2 IS NULL; UPDATE INUSE SET Server3 = FALSE WHERE INUSE.Server3 IS NULL; UPDATE INUSE SET Server4 = FALSE WHERE INUSE.Server4 IS NULL; UPDATE INUSE SET Server5 = FALSE WHERE INUSE.Server5 IS NULL;");
    //await dat("UPDATE INUSE SET Server2 = FALSE WHERE INUSE.Server2 IS NULL;");
    //await dat2("UPDATE INUSE SET Server3 = FALSE WHERE INUSE.Server3 IS NULL;");
    //await dat("UPDATE INUSE SET Server4 = FALSE WHERE INUSE.Server4 IS NULL;");
    //await dat2("UPDATE INUSE SET Server5 = FALSE WHERE INUSE.Server5 IS NULL;");
    console.warn("TABLE INITIALISIERT");
    Server1 = await dat("SELECT * FROM INUSE;");
    console.log("Verbinde mit Datenbank...");
    await Sleep(1000);
    console.log("Verbunden");
    console.log(typeof Server1);
    console.log(Server1);
    let errcount = 0;
    while (Server1 === undefined && errcount < 6) {
      errcount++;
      await Sleep(100);
      if (errcount == 5) {
        alert("Datenbank konnte nicht geladen werden. Bitte versichere, dass die Datenbank existiert");
        if (confirm("Möchtest du zum Hauptmenü zurückkehren?")) {
          location.href = "./index.html";
        }
        else {
          break;
        }
      }
      console.log(errcount);
      console.log("Erneut");
      // Server1 = await dat("SELECT * FROM INUSE;");
      // console.log(Server1);
      // await Sleep(10);
    }
    console.log(Server1);
    console.log(myEmitter);
    if (Server1[0].Server1 == 0) {
      await dat("UPDATE INUSE SET Server1 = TRUE;"); //Server 1 belegen || Use Server 1
       belegt = 1;
       belegt2 = belegt;
       //return belegt;
    }
    else if (Server1[0].Server2 == 0) {
      await dat("UPDATE INUSE SET Server2 = TRUE;"); //Server 2 belegen
      const belegt = 2;
      belegt2 = belegt;
      //return belegt;
    }
    else if (Server1[0].Server3 == 0) {
      await dat("UPDATE INUSE SET Server3 = TRUE;"); //Server 3 belegen
      const belegt = 3;
      belegt2 = belegt;
      //return belegt;
    }
    else if (Server1[0].Server4 == 0) {
      await dat("UPDATE INUSE SET Server4 = TRUE;"); //Server 4 belegen
      const belegt = 4;
      belegt2 = belegt;
      //return belegt;
    }
    else if (Server1[0].Server5 == 0) {
      await dat("UPDATE INUSE SET Server5 = TRUE;"); //Server 5 belegen
      const belegt = 5;
      belegt2 = belegt;
      //return belegt;
    }
    else {
      alert("Zurzeit sind alle Server belegt... bitte versuche es später noch einmal!"); //Alle Server belegt
      location.reload();
    }
    alert("Es wurde Server "+belegt2+" ausgewählt!");

    await dat("UPDATE SERVER"+belegt2+" SET Spieler1IP = '"+IPAdresse+"'; UPDATE SERVER"+belegt2+" SET Spieler1Name = '"+Spieler1Name+"';");
    WaitForPlayer();
    return belegt;
  }
}

1 个答案:

答案 0 :(得分:1)

问题在于变量temp是由您之前请求的查询设置的,甚至在数据库尚未回答该查询之前就将其返回。我强烈建议您调查Promises。

以下代码正在执行问题中的内容。注意方法resolve()reject()的调用位置。

async function connect() {
  return new Promise((resolve, reject) => {
    // Assuming con is defined somewhere above.
    con.connect(function(err) {
      if (err) return reject(err);
      console.log("MySQL: Connected to localhost!");
      con.query("USE abschlussprojekt;", function (err, result) {
        if (err) return reject(err);
        console.log(result);
        return resolve();
      });
    });
  })
}

async function query(Befehl) {
  return new Promise((resolve, reject) => {
    con.query(Befehl, function (err, result) {
      if (err) return reject(err);

      return resolve(result);
    });
  })
}

async function dat(Befehl) {
  await connect();
  const result = await query(Befehl);
  con.close();
  return result;
}

有关承诺的帮助:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

有关异步的帮助:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function