2013-09-25 12 views
7

Sto usando Sequelize come ORM. Ecco il mio modello di utente:get .findOrCreate() error

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

sto risparmiando all'utente:

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 

Se la posta elettronica è valido (e-mail: "[email protected]"), tutto funziona alla grande. Ma se l'e-mail non riesce a convalidare (come nell'esempio sopra), ottengo un errore di inserimento. Come catturare il tipo di errore? Il metodo .error non può ottenere alcun parametro di errore.

+0

si può girare su tronchi SQL per sequelize. Ti fornirà la query che stai tentando di eseguire che sta causando l'errore. anche @Sriharsha è corretto che è necessario specificare la stringa args per console.log l'errore –

risposta

7

sequelize passerà l'errore come parametro alla funzione di errore.

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); 
}) 

CoffeScript:

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

grazie, non so spiegare perché non aveva funzionato per me prima. Ad esempio come errore ottengo una stringa 'Errore: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Valore intero errato: '' per la colonna 'coreNumber' nella riga 1'. Come posso ottenere smth come codice di errore e ID di riga? Ho bisogno di questo per gestire automaticamente gli errori di input per mostrare l'errore per l'utente. O sarà meglio convalidare l'input prima dell'inserimento nel DB manualmente? – f1nn

+0

Stai cercando un'espressione regolare che tirerà ER_TRUNCATED_WRONG_VALUE_FOR_FIELD e la riga 1 fuori da quella stringa di errore? – 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: come @Domi sottolineato, il modo migliore è quello di utilizzare 'spread' in invece di 'allora'

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

In base al collegamento condiviso, questo codice funziona, ma non è il metodo consigliato per lavorare con metodi che restituiscono più argomenti. Puoi usare 'spread (utente, creato)' invece di 'then (userAndCreatedInOneArray)' con 'findOrCreate', per salvarti lavorando con l'array che chiami' user' (ma in realtà non è l'utente). – Domi

+2

@Domi buon punto, ho modificato la risposta – salexch

3

Sequelize 2.0 sintassi modifiche e ora sarebbe

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, si consiglia all'utente .spread() http://docs.sequelizejs.com/en/latest/api/model/#findorcreateoptions-promiseinstance-created – Kad