2013-09-25 5 views
7

Ich verwende Sequelize als ORM. Hier ist mein Benutzermodell:get .findOrCreate() Fehler

### 
    User model 
### 
User = exports.User = globals.sequelize.define "User", 
    username: globals.Sequelize.STRING 
    email: 
     type: globals.Sequelize.STRING 
     validate: 
      isEmail: true 
    hash:  globals.Sequelize.STRING 
    salt:  globals.Sequelize.STRING(512) 
    fname: globals.Sequelize.STRING 
    lname: globals.Sequelize.STRING 
    country: globals.Sequelize.STRING 

Ich bin Benutzer zu speichern:

globals.models.User.findOrCreate 
    username: "johny" 
    password: "pass" 
    email: "johny93[###]example.com" 
.success (user, created)-> 
    console.log user.values 
    res.send 200 
.error -> 
    console.log err # how to catch this? 
    res.send 502 

Wenn E-Mail gültig ist (E-Mail: "[email protected]"), alles funktioniert super. Aber wenn E-Mail-Validierung fehlschlägt (wie im obigen Beispiel), erhalte ich einen Einfügungsfehler. Wie kann man den Fehlertyp abfangen? .error Methode kann keine Fehlerparameter erhalten.

+0

Können Sie drehen für sequelize auf SQL-Protokolle würden. Es gibt Ihnen die Abfrage, die Sie ausführen möchten, die den Fehler verursacht. auch @Sriharsha ist korrekt, dass Sie die args-Zeichenfolge angeben müssen, um console.log den Fehler –

Antwort

7

Sequelize wird den Fehler als Parameter an die Fehlerfunktion übergeben.

JavaScript:

User.findOrCreate({username: "johny",password: "pass",email: "johny93[###]example.com"}) 
.success(function(user, created){ 
    console.log(user.values); 
    res.send(200); 
}) 
.error(function(err){ 
    console.log('Error occured' + err); 
}) 

Coffeescript:

globals.models.User.findOrCreate 
    username: "johny" 
    password: "pass" 
    email: "johny93[###]example.com" 
.success (user, created)-> 
    console.log user.values 
    res.send 200 
.error (error)-> 
    console.log error # how to catch this? 
    res.send 502 
+0

danke, ich kann nicht erklären, warum es nicht für mich zuvor funktioniert hatte. Zum Beispiel als Fehler bekomme ich eine Zeichenfolge 'Fehler: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Falscher Integer-Wert: '' für Spalte 'coreNumber' in Zeile 1 '. Wie kann ich etw wie Fehlercode und Zeilen-ID erhalten? Ich brauche das, um Eingabefehler automatisch zu behandeln, um Fehler für Benutzer anzuzeigen. Oder ist es besser, die Eingabe vor dem manuellen Einfügen in die Datenbank zu validieren? – f1nn

+0

Suchen Sie nach einer Regex, die ER_TRUNCATED_WRONG_VALUE_FOR_FIELD und Zeile 1 aus dieser Fehlerzeichenfolge ziehen wird? – dankohn

13
User.findOrCreate({ 
    where: { 
    username: "johny", 
    password: "pass", 
    email: "johny93[###]example.com" 
    }, 
    defaults: { 
    //properties to be created 
    } 
}).then(function(user){ 
    var created = user[1]; 
    user = user[0]; 
    console.log(user.values); 
}).fail(function(err){ 
    console.log('Error occured', err); 
}); 

https://github.com/sequelize/sequelize/wiki/Upgrading-to-2.0

EDIT: als @Domi wies darauf hin, besserer Weg ist 'Spread' zu verwenden, im anstelle von 'und dann'

User.findOrCreate({ 
    where: { 
    username: "johny", 
    password: "pass", 
    email: "johny93[###]example.com" 
    }, 
    defaults: { 
    //properties to be created 
    } 
}).spread(function(user, created){ 
    console.log(user.values); 
}).fail(function(err){ 
    console.log('Error occured', err); 
}); 
+1

Nach dem Link, den Sie freigegeben haben, funktioniert dieser Code, aber es ist nicht die empfohlene Methode zum Arbeiten mit Methoden, die mehrere Argumente zurückgeben. Sie können 'spread (user, created)' anstelle von 'then (userAndCreatedInOneArray)' mit 'findOrCreate' verwenden, um Sie bei der Arbeit mit dem Array zu sparen, das Sie' user' nennen (ist aber wirklich nicht der Benutzer). – Domi

+2

@Domi guter Punkt, änderte ich die Antwort – salexch

3

Sequelize 2.0 Änderungen Syntax und sein jetzt

User.findOrCreate({ 
    where: { 
    username: 'johny', 
    password: 'pass', 
    email: 'johny93[###]example.com' 
    } 
}).then(function (user) { 
    res.send(200); 
}).catch(function (err) { 
    console.log(err); 
    res.send(502); 
}); 
+2

In Sequelize 3.0, es wird empfohlen, Benutzer .spread() http://docs.sequelizejs.com/en/latest/api/model/#findorcreateoptions-promiseinstance-created – Kad

Verwandte Themen