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: