2013-09-25 7 views
7

Używam Sequelize jako ORM. Oto mój model użytkownika:Pobierz .findOrCreate() błąd

### 
    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 

ja ratuję użytkownika:

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 

Jeśli e-mail jest prawidłowy (e-mail: "[email protected]"), wszystko działa świetnie. Ale jeśli wiadomość e-mail nie powiedzie się sprawdzania poprawności (jak w powyższym przykładzie), pojawia się błąd wstawienia. Jak złapać typ błędu? .error Metoda nie może uzyskać żadnych parametrów błędu.

+0

można włączyć dzienników SQL dla sequelize. Otrzymasz zapytanie, które próbujesz uruchomić, które powoduje błąd. również @Sriharsha jest poprawne, że musisz określić ciąg args w celu konsoli.log błąd –

Odpowiedz

7

sequelize przekaże błąd jako parametr do funkcji błędu.

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

dziękuję, nie mogę wyjaśnić, dlaczego to nie działało dla mnie wcześniej. Na przykład jako błąd otrzymuję ciąg 'Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Niepoprawna wartość całkowita: '' dla kolumny 'coreNumber' w wierszu 1'. Jak mogę uzyskać coś podobnego do kodu błędu i identyfikatora wiersza? Potrzebuję tego, aby automatycznie obsługiwać błędy wejściowe, aby pokazać błąd dla użytkownika. A może lepiej będzie sprawdzić poprawność danych wejściowych przed wstawieniem do DB ręcznie? – f1nn

+0

Czy szukasz wyrażenia regularnego, które spowoduje przeciągnięcie ER_TRUNCATED_WRONG_VALUE_FOR_FIELD i wiersz 1 z tego ciągu błędów? – 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: jak @Domi wskazał, lepszym sposobem jest użycie 'rozłożone' w zamiast 'potem'

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

Zgodnie z udostępnionym łączem ten kod działa, ale nie jest zalecanym sposobem pracy z metodami, które zwracają wiele argumentów. Możesz użyć 'spread (user, created)' zamiast 'then (userAndCreatedInOneArray)' z 'findOrCreate', aby zaoszczędzić ci pracy z tablicą, którą nazywasz' user' (ale tak naprawdę nie jest to użytkownik). – Domi

+2

@Domi dobry punkt, zmieniłem odpowiedź – salexch

3

Sequelize składni 2.0 zmiany i będzie teraz

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

W Sequelize 3.0, zaleca się użytkownikowi .spread() http://docs.sequelizejs.com/en/latest/api/model/#findorcreateoptions-promiseinstance-created – Kad