Node-Mysql rows undefined

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Node-Mysql rows undefined

    Guten Tag,

    nach den Vorschlägen von gestern versuche ich heute mein Projekt besser zu strukturieren. Dazu packe ich alle Datenbank Operationen in ein eigenes Modul. Benutzer über "InsertUser" der Datenbank hinzuzufügen funktioniert problemlos. Allerdings funktioniert die Abfrage der Nutzer Daten aus einem mir unbekannten Grund nicht. Wenn ich die abfrage durchführe ist die Variable rows immer undefiniert. Da ich in meiner alten Implementierung aber quasi den selben code genutzt verstehe ich diesen Fehler nicht so ganz. Hier mal der code zu dem Modul. Es geht um die Funktion "checkUserCredentials" ab Zeile 41.

    JavaScript-Quellcode

    1. /**
    2. * Datenbank modul
    3. */
    4. var mysql = require('mysql');
    5. var connection = mysql.createConnection(
    6. {
    7. host: 'localhost',
    8. user: 'root',
    9. password: '',
    10. database : 'bestellapp'
    11. }
    12. );
    13. connection.connect(function (error) {
    14. if(error){
    15. console.log(error);
    16. }else{
    17. console.log('Database : Connected');
    18. }
    19. });
    20. function disconnectDatabase() {
    21. connection.destroy();
    22. console.log('Database : Connection destroyed');
    23. };
    24. exports.insertUser = function (username,pincode) {
    25. connection.query("INSERT INTO users (username,password) VALUES (?,?);",[username,pincode],function (error,rows,fields) {
    26. if(error) {
    27. console.log(error);
    28. return false ;
    29. } else{
    30. return true;
    31. }
    32. });
    33. };
    34. exports.checkUserCredentials = function (username,pincode) {
    35. connection.query("SELECT * FROM users WHERE username=? AND password=? ;",[username,pincode],function (error,rows,fields) {
    36. if(error) throw error
    37. if(rows.length == 1){
    38. return true;
    39. }else{
    40. return false ;
    41. }
    42. });
    43. };
    Alles anzeigen
  • Der einzige Fehler, den ich in deinem Code feststellen kann, ist, dass sowohl insertUser als auch checkUserCredentials immer undefined zurückgeben werden. Dein return true/false werden nicht nach außen wirksam, da query asynchron arbeitet.


    Ich kann mir nur vorstellen, dass rows deshalb undefined ist, weil der error geworfen wurde. In dem Fall müsste man den Fehler noch weiter untersuchen.
  • Hmm was mir aufgefallen ist ist das der Output "Database : Connected" immer erst nach dem Outuput von checkUserCredentials/inserUser erscheint. Ich habe mir da allerdings keine Gedanken zu gemacht weil bei insertUser die Daten auf jeden Fall in die Datenbank eingetragen werden. Aber du hast recht beide geben immer undefined zurück. Ich kenne Asynchrone Operationen von Android aber wieso hat es bei meiner Implementierung von gestern dann funktioniert? Der einzige unterschied liegt darin das ich ein Modul verwende anstatt die Funktion direkt in das Script zu integrieren... Theoretisch sollte das dann genauso undefined zurückliefern oder übersehe ich etwas?

    Edit: Errors werden übrigens keine geworfen
  • tiobald schrieb:

    Hmm was mir aufgefallen ist ist das der Output "Database : Connected" immer erst nach dem Outuput von checkUserCredentials/inserUser erscheint. Ich habe mir da allerdings keine Gedanken zu gemacht weil bei insertUser die Daten auf jeden Fall in die Datenbank eingetragen werden.
    Das ist schon mal eine sehr große Fehlerquelle. Du solltest dafür sorgen, dass dein restlicher Code erst ausgeführt wird, nachdem das "connected"-Event gefeuert wurde.

    tiobald schrieb:

    Ich kenne Asynchrone Operationen von Android aber wieso hat es bei meiner Implementierung von gestern dann funktioniert? Der einzige unterschied liegt darin das ich ein Modul verwende anstatt die Funktion direkt in das Script zu integrieren... Theoretisch sollte das dann genauso undefined zurückliefern oder übersehe ich etwas?
    Gestern hattest du connection.query im direkten Kontext und ohne returns eingesetzt (keine Funktion). Daher war alles da wo es sein sollte, wann es da sein sollte.

    In meinem Beispiel von Gestern hab ich dieses Problem gelöst, in dem ich ein Promise zurückgegeben habe.
  • Ich habe mal versucht das umzusetzen, allerdings bekomme ich immer "TypeError: undefined is not a promise". Zu testzwecken habe ich jetzt erst einmal das Verbinden mit der Datenbank in die Funktion mit reingesetzt

    Quellcode

    1. database.checkUserCredentials('timo',1234)
    2. .then(function(result){
    3. console.log("Login erfolgreich: "+result);
    4. })
    5. .catch(function (error) {
    6. console.log("Login fehler");
    7. }) ;

    Quellcode

    1. exports.checkUserCredentials = function (username,pincode) {
    2. connection.connect(function (error) {
    3. if(error){
    4. console.log(error);
    5. }else{
    6. console.log('Database : Connected');
    7. }
    8. });
    9. return Promise(function(resolve,reject){
    10. connection.query("SELECT * FROM users WHERE username=? AND password=? ;",[username,pincode],function (error,rows,fields) {
    11. if(error) throw error ;
    12. if(row.length == 1){
    13. resolve(true);
    14. }else{
    15. resolve(false);
    16. }
    17. });
    18. });
    19. };
    Alles anzeigen
  • tiobald schrieb:

    Ich habe mal versucht das umzusetzen, allerdings bekomme ich immer "TypeError: undefined is not a promise".
    Mein Fehler. Vor Promise() muss immer ein new stehen.



    tiobald schrieb:

    Zu testzwecken habe ich jetzt erst einmal das Verbinden mit der Datenbank in die Funktion mit reingesetzt
    Das macht es eher schlechter und nicht besser.

    Hier mal die überarbeitete Version:

    JavaScript-Quellcode: test.js

    1. const database = require('./database.js')
    2. database.connectDatabase().then(() => {
    3. // In diesem Block kann man sicher sein,
    4. // dass die Datenbankverbindung steht
    5. database.checkUserCredentials('timo',1234)
    6. .then(function(result) {
    7. console.log("Login erfolgreich: " + result)
    8. })
    9. .catch(function(error) {
    10. console.log("Login fehler")
    11. })
    12. }, console.error)
    Alles anzeigen


    JavaScript-Quellcode: database.js

    1. /**
    2. * Datenbank modul
    3. */
    4. const mysql = require('mysql')
    5. const connection = mysql.createConnection({
    6. host: 'localhost',
    7. user: 'root',
    8. password: '',
    9. database: 'bestellapp'
    10. })
    11. function connectDatabase() {
    12. return new Promise((resolve, reject) => {
    13. connection.connect(error => {
    14. if (error) {
    15. reject(error)
    16. } else {
    17. console.log('Database : Connected')
    18. resolve()
    19. }
    20. })
    21. })
    22. }
    23. function disconnectDatabase() {
    24. return new Promise((resolve, reject) => {
    25. connection.end(error => {
    26. if (error) return reject(error)
    27. console.log('Database : Connection destroyed')
    28. resolve()
    29. })
    30. })
    31. }
    32. function insertUser(username, pincode) {
    33. return new Promise((resolve, reject) => {
    34. connection.query(
    35. 'INSERT INTO users (username, password) VALUES (?, ?);',
    36. [username, pincode],
    37. error => {
    38. if (error) {
    39. reject(error)
    40. } else {
    41. resolve()
    42. }
    43. })
    44. })
    45. }
    46. function checkUserCredentials(username, pincode) {
    47. return new Promise((resolve, reject) => {
    48. connection.query("SELECT * FROM users WHERE username=? AND password=? ;", [username, pincode], function(error, rows) {
    49. if (error) return reject(error)
    50. if (rows.length == 1) {
    51. resolve(true)
    52. } else {
    53. resolve(false)
    54. }
    55. })
    56. })
    57. }
    58. module.exports = {
    59. connectDatabase,
    60. disconnectDatabase,
    61. insertUser,
    62. checkUserCredentials,
    63. }
    Alles anzeigen