get .findOrCreate() error

14,022

Solution 1

sequelize will pass the error as the paramater to the error function.

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

Solution 2

 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: as @Domi pointed out, better way is to use 'spread' instead of 'then'

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

Solution 3

Sequelize 2.0 changes syntax and would now be

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);
});
Share:
14,022
f1nn
Author by

f1nn

Updated on August 04, 2022

Comments

  • f1nn
    f1nn almost 2 years

    I'm using Sequelize as ORM. Here's my user model:

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

    I'm saving user:

    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
    

    If email is valid (email: "[email protected]"), everything works great. But if email fails validation (as in the example above), I get an insertion error. How to catch error type? .error method can't get any error parameters.

  • f1nn
    f1nn over 10 years
    thank you, I can't explain why it had not worked for me before. For example as error I get a string Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect integer value: '' for column 'coreNumber' at row 1. How can I get smth like error code and row id? I need this to handle input errors automatically to show error for user. Or will it be better to validate input before insertion to DB manually?
  • Dan Kohn
    Dan Kohn over 10 years
    Are you looking for a regex that will pull ER_TRUNCATED_WRONG_VALUE_FOR_FIELD and row 1 out of that error string?
  • Domi
    Domi over 9 years
    According to the link you shared, this code works, but it's not the recommended way to work with methods that return multiple arguments. You can use spread(user, created) instead of then(userAndCreatedInOneArray) with findOrCreate, to save you working with the array you call user (but is really not the user).
  • Kad
    Kad about 8 years
    In Sequelize 3.0, it is recommended to user .spread() docs.sequelizejs.com/en/latest/api/model/…