Javascript 在Sequelize钩子中使用承诺

Javascript 在Sequelize钩子中使用承诺,javascript,mysql,node.js,orm,sequelize.js,Javascript,Mysql,Node.js,Orm,Sequelize.js,在公园里。但是,下面的代码对我来说都不起作用——对于Sequelize的最新1.x和2.x版本 我设置了用户模型: var User = function(sequelize, DataTypes) { var User = sequelize.define('User', { firstName: DataTypes.STRING, lastName: DataTypes.STRING, email: DataTypes.STRING,

在公园里。但是,下面的代码对我来说都不起作用——对于Sequelize的最新1.x和2.x版本

我设置了用户模型:

var User = function(sequelize, DataTypes) {
    var User = sequelize.define('User', {
        firstName: DataTypes.STRING,
        lastName: DataTypes.STRING,
        email: DataTypes.STRING,
        password: DataTypes.STRING
    }, {
        hooks: {
            beforeUpdate: _hashPassword,
            beforeCreate: _hashPassword
        }
    });

    return User;
};
function _hashPassword(user) {
    if (!user.getDataValue('password')) {
        return Promise.reject();
    }

    return bcryptGenSalt(10)
        .then(function(salt) {
            return bcryptHash(user.getDataValue('password'), salt);
        })
        .then(function(hash) {
            user.setDataValue('password', hash);

            return user;
        });
}
function _hashPassword(user, cb) {
    if (!user.getDataValue('password')) {
        return Promise.reject();
    }

    bcryptGenSalt(10)
        .then(function(salt) {
            return bcryptHash(user.getDataValue('password'), salt);
        })
        .then(function(hash) {
            user.setDataValue('password', hash);

            cb(null, user);
        });
}
这是我的函数,使用承诺(无效)对用户密码进行哈希运算:

var User = function(sequelize, DataTypes) {
    var User = sequelize.define('User', {
        firstName: DataTypes.STRING,
        lastName: DataTypes.STRING,
        email: DataTypes.STRING,
        password: DataTypes.STRING
    }, {
        hooks: {
            beforeUpdate: _hashPassword,
            beforeCreate: _hashPassword
        }
    });

    return User;
};
function _hashPassword(user) {
    if (!user.getDataValue('password')) {
        return Promise.reject();
    }

    return bcryptGenSalt(10)
        .then(function(salt) {
            return bcryptHash(user.getDataValue('password'), salt);
        })
        .then(function(hash) {
            user.setDataValue('password', hash);

            return user;
        });
}
function _hashPassword(user, cb) {
    if (!user.getDataValue('password')) {
        return Promise.reject();
    }

    bcryptGenSalt(10)
        .then(function(salt) {
            return bcryptHash(user.getDataValue('password'), salt);
        })
        .then(function(hash) {
            user.setDataValue('password', hash);

            cb(null, user);
        });
}
我不能用这样的钩子设置创建用户。我没有收到任何错误,但什么也没有发生–没有用户被创建/保存到数据库中。如果我将我的
\u hashPassword(user)
方法更改为在成功时调用回调函数,而不是返回承诺,则将创建用户并成功哈希密码:

这是我使用回调函数的哈希函数(有效):

var User = function(sequelize, DataTypes) {
    var User = sequelize.define('User', {
        firstName: DataTypes.STRING,
        lastName: DataTypes.STRING,
        email: DataTypes.STRING,
        password: DataTypes.STRING
    }, {
        hooks: {
            beforeUpdate: _hashPassword,
            beforeCreate: _hashPassword
        }
    });

    return User;
};
function _hashPassword(user) {
    if (!user.getDataValue('password')) {
        return Promise.reject();
    }

    return bcryptGenSalt(10)
        .then(function(salt) {
            return bcryptHash(user.getDataValue('password'), salt);
        })
        .then(function(hash) {
            user.setDataValue('password', hash);

            return user;
        });
}
function _hashPassword(user, cb) {
    if (!user.getDataValue('password')) {
        return Promise.reject();
    }

    bcryptGenSalt(10)
        .then(function(salt) {
            return bcryptHash(user.getDataValue('password'), salt);
        })
        .then(function(hash) {
            user.setDataValue('password', hash);

            cb(null, user);
        });
}
我真的很想用承诺来保持事情的一致性。我错过什么了吗?这是一个bug还是文档中有错误?在Sequelize for me的最新1.x和2.x版本中,这种行为是相同的


非常感谢您的帮助!:)

您可以在这里使用sequelize承诺

return sequelize.Promise.reject('Some Error');

把承诺还给钩子可能只对主人有效。有人证实了吗?我相信我遇到了同样的问题,但是主分支(尽管稍微落后)。