Sequelize:有没有办法从实例方法更新值

时间:2017-03-04 20:03:49

标签: node.js express sequelize.js

我正在尝试在创建帐户后向列添加值,并且我希望从模型的实例方法执行此操作。我以典型的方式在服务中创建帐户,我想使用sequelize生成的用户id连接到另一个生成的id,该id也存储在每个用户的Users表中。我基本上想要在创建用户后调用实例方法,如下所示:

型号:

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);
    });
}

1 个答案:

答案 0 :(得分:1)

你可以用两种方式做到这一点

  • 使用创建新实例后立即运行的afterCreate挂钩
  • 使用更新指定列值的实例方法。

第一个选项非常舒适,因为每次创建新的模型实例时都会运行它,因此您不必记住每次要生成唯一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);
});