2016-04-01 8 views
0

ich den Fehler bekommen:Deadlock mit Sequelize mit beforeCreate und findOrCreate auf einem Modell

Unhandled rejection SequelizeDatabaseError: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction 

Hier ist mein Modell:

var bcrypt = require('bcryptjs'); 

module.exports = function (sequelize, DataTypes) { 
    var User = sequelize.define('User', { 
     username: {type: DataTypes.STRING, unique: true}, 
     password: DataTypes.STRING, 
     email: DataTypes.STRING, 
     isAdmin: DataTypes.BOOLEAN, 
     isActive: DataTypes.BOOLEAN 
    }, { 
     classMethods: { 
      associate: function (models) { 
       User.hasMany(models.Comment); 
       User.hasMany(models.Message, {as: 'receivedMessages', foreignKey: 'Receiver'}); 
       User.hasMany(models.Message, {as: 'sentMessages', foreignKey: 'Sender'}); 
      } 
     } 
    }); 

    User.hook('beforeCreate', function (user, options, fn) { 
     bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) { 
      if (err) { 
       return next(err); 
      } 
      bcrypt.hash(user.password, salt, function (err, hash) { 
       if (err) { 
        return next(err); 
       } 
       user.password = hash; 
       return fn(err, user); 
      }); 
     }); 
    }); 

    User.findOrCreate({ 
     where: { 
      username: 'admin' 
     }, 
     defaults: { 
      username: 'admin', 
      email: '[email protected]', 
      password: 'admin', 
      isAdmin: true, 
      isActive: true 
     } 
    }); 

    return User; 
}; 

Wenn ich einen der Haken (beforeCreate oder findOrCreate entfernen), es funktioniert gut.

Es scheint ein Problem über die Transaktion zu sein, aber ich kann keinen Weg finden, es zum Laufen zu bringen.

Das Dokument spricht über die Übergabe der Transaktion, aber ich weiß nicht, wie Sie die Transaktion an findOrCreate übergeben. Hier ist das Dokument: http://docs.sequelizejs.com/en/latest/docs/hooks/#model-hooks

Irgendeine Idee? Danke im Voraus!!

User.find(
    { 
     where: { 
      username: 'admin' 
     } 
    } 
).then(function (user) { 
     if (!user) { 
      User.create({ 
       username: 'admin', 
       email: '[email protected]', 
       password: 'admin', 
       isAdmin: true, 
       isActive: true 
      }).then(function (newUser) { 
       console.log('Admin created with id: ' + newUser.id); 
      }); 
     } 
    } 
); 

die beste Antwort Vielleicht nicht, aber es funktioniert:

Antwort

0

keine Lösung, sondern ein Problem zu umgehen, anstatt den Haken „findOrCreate“ verwendet wird, habe ich es von meinem eigenen gemacht.