Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在模型上使用beforeCreate和findOrCreate与Sequelize发生死锁_Javascript_Mysql_Node.js_Deadlock_Sequelize.js - Fatal编程技术网

Javascript 在模型上使用beforeCreate和findOrCreate与Sequelize发生死锁

Javascript 在模型上使用beforeCreate和findOrCreate与Sequelize发生死锁,javascript,mysql,node.js,deadlock,sequelize.js,Javascript,Mysql,Node.js,Deadlock,Sequelize.js,我得到了一个错误: Unhandled rejection SequelizeDatabaseError: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction 这是我的模型: var bcrypt = require('bcryptjs'); module.exports = function (sequelize, DataTypes) { var User = s

我得到了一个错误:

Unhandled rejection SequelizeDatabaseError: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction
这是我的模型:

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: 'admin@admin.com',
            password: 'admin',
            isAdmin: true,
            isActive: true
        }
    });

    return User;
};
如果我移除其中一个钩子(在forecreate或findOrCreate之前),它可以正常工作

这似乎是一个关于交易的问题,但我找不到一个办法让它起作用

文档谈到传递事务,但我不知道如何将事务传递给findOrCreate。 这是文件:


有什么想法吗?提前谢谢

这不是一个解决方案,而是一个解决方案,我不是使用钩子“findOrCreate”,而是自己做的:

User.find(
    {
        where: {
            username: 'admin'
        }
    }
).then(function (user) {
        if (!user) {
            User.create({
                username: 'admin',
                email: 'admin@admin.com',
                password: 'admin',
                isAdmin: true,
                isActive: true
            }).then(function (newUser) {
                console.log('Admin created with id: ' + newUser.id);
            });
        }
    }
);
也许不是最好的答案,但它是有效的