Node.js Sequelize:是否有方法从实例方法更新值

Node.js Sequelize:是否有方法从实例方法更新值,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,我正在尝试在创建帐户后向列添加一个值,我想从模型的instance方法执行此操作。我正在以典型的方式在服务中创建帐户,我希望使用sequelize to concat生成的用户id来生成另一个生成的id,该id也与每个用户一起存储在users表中。我基本上希望在创建用户后调用instance方法,如下所示: 型号: module.exports = function(sequelize) { let User = sequelize.define('User', { email:

我正在尝试在创建帐户后向列添加一个值,我想从模型的instance方法执行此操作。我正在以典型的方式在服务中创建帐户,我希望使用sequelize to concat生成的用户id来生成另一个生成的id,该id也与每个用户一起存储在users表中。我基本上希望在创建用户后调用instance方法,如下所示:

型号:

module.exports = function(sequelize) {

  let User = sequelize.define('User', {
    email: ORM.STRING,
    password: ORM.STRING,
    accountVerified: {
      type: ORM.INTEGER,
      defaultValue: 0
    }
  },
  {
    classMethods: {
      hashPassword: function(password) {
        return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
      }
    },
    instanceMethods: {
      validatePassword: function(password) {
        return bcrypt.compareSync(password, this.password);
      },
      uniqueId: function() {
        let ch = this.id + sid.generate();
        this.userId = this.id + sid.generate();
      }
    }
  });

  return User;
};
服务:

findOrCreate(email, password, done) {
  let cachedEmail = email;

  this.models.User
    .findOrCreate({
      where: { email: email },
      defaults: {
        password: this.models.User.hashPassword(password)
      }
    })
    .spread(function(user, created) {
      if (!created) {
        return done(null, false, {
          email: cachedEmail,
          message: `Email ${cachedEmail} already exists.`
        });
      }
      user.uniqueId();
      done(null, user);
    });
}

你可以用两种方法来做

  • 使用创建新实例后立即运行的钩子
  • 使用更新指定列值的实例方法
第一个选项非常方便,因为它在每次创建模型的新实例时都会运行,所以您不必在每次生成唯一id时都记得添加代码

{
    hooks: {
        afterCreate: function(user, options){
            let uniqueId = user.get('id') + sid.generate();
            return user.set('userId', uniqueId).save().then((self) => {
                return self;
            });
        }
    }
}
上述代码只需在新创建的用户实例上执行
UPDATE

另一方面,如果您想使用实例方法,它应该是这样的

{
    instanceMethods: {
        uniqueId: function() {
            let uniqueId = this.get('id') + sid.generate();
            return this.set('userId', uniqueId).save().then((self) => {
                return self;
            });
        }
    }
}
然后您可以将其作为普通实例方法调用,但它会返回一个承诺

userInstance.uniqueId().then((user) => {
    // updated user
    done(null, user);
}).catch(e => {
    // handle error
    done(e);
});

非常感谢。我使用生成UUID,因为我认为它更有效。然而,你的回答对我来说是一次很好的学习经历,我相信迟早会有一个用例出现。