2017-07-19 1 views
0

Ich versuche, "wahr" von Hash zu erhalten vergleichen. aber ein Problem tritt auf, wenn ich einen Benutzernamen schreibe, der nicht in der Datenbank existiert. Zum Beispiel: wenn es keine "jack.33" als Benutzername gibt, wirft es mysql Fehler und stoppt den Server. Wie kann ich diesen Fehler blockieren oder eine Lösung erstellen? Hier ist der Fehler:Node.js "/ Login" DB Fehler

throw err; // Rethrow non-MySQL errors 
      ^
TypeError: Cannot read property 'password' of undefined 


app.post("/login", function(request, response) { 
     var username = request.body.username; 
     var pass = request.body.pass; 

     con.query("select password from user where username = " + "\"" + username + "\"",function (err, result) { 
      if(err) throw err; 
      var passer = result[0].password; 
      bcrypt.compare(pass, passer, function (err, res) { 
       console.log(res); 
       if (res === true) { 
        response.send("success") 
       }else{ 
        response.send("nop") 
       } 
      }); 
     }); 
    }); 
+1

Sie müssen überprüfen, ob das Array "result" tatsächlich Zeug enthält. Die Abfrage kann erfolgreich ausgeführt werden, erzeugt jedoch null Zeilen. – tadman

+0

Es sieht so aus, als ob Sie diesen Fehler direkt nach der Abfrage selbst auslösen. Fangen Sie ihn irgendwo auf? –

+0

@tadman Ich überprüfe es mit, wenn Bedingung, aber ich kann den Fehler nicht stoppen, gibt es eine Möglichkeit, den Code nach if (result === null) Bedingung zu stoppen? –

Antwort

3

Der Fehler, den Sie dort bekommen haben, wurde nicht von Ihrem Datenbanktreiber ausgelöst.

ist ein typischer Fehler, der ausgelöst wird, wenn der Code eine Eigenschaft erwartet, die für ein Objekt nicht vorhanden ist.

Ihre SELECT Abfrage kann 0 oder mehr Zeilen zurückgeben, und wenn nichts zurückgegeben wird, vermute ich, dass Ihr Datenbanktreiber Ihnen ein leeres Array [] gibt. Daher wäre der Index 0 von []undefined.

Jetzt wird undefined.password mit einem ähnlichen Fehler sterben, weil die Eigenschaft password nicht Teil des Objekts undefined ist.

Beispiel:

var result = []; // Assume SELECT query returns 0 row. 
 
result[0].password;

Anders als zu prüfen, ob err definiert ist. Ihr Code muss auch für ein Szenario sorgen, in dem kein Benutzer vorhanden ist.

Eine einfache Überprüfung wie if result.length === 1 sollte Ihren logischen Fehler beheben.

Sie fragen sich vielleicht, was, wenn mehr als 1 Zeile zurückgegeben wird? Dies ist normalerweise nicht möglich, es sei denn, Sie haben ein schlechtes Datenbankdesign, bei dem Benutzernamen nicht eindeutig sind. Mit anderen Worten, Sie haben ein größeres Problem.

+0

if (result.length === 1) {passier = result [0] .password;} löste mein Problem. Danke.. –

1

Sie auch global alle nicht abgefangenen Fehler fangen.

process.on('uncaughtException', function (err) { 
    console.log('UNCAUGHT', err.stack); 
}); 
+0

Dies ist eine Lösung, um weiter zu arbeiten. Wie kann ich if (result === null) {response.send ("nop")} verwenden und den Prozess stoppen? –

+0

@ AhmetAzizBeşli process.exit(); –