2017-03-04 111 views
0

我想在创建帐户后向列添加值,我想从模型的实例方法执行此操作。我以典型的方式在服务中创建帐户,并且我想使用由sequelize生成的用户id连接到另一个生成的ID,该ID也存储在每个用户的Users表中。我基本上是想调用实例方法一旦创建了用户,如下所示:Sequelize:有没有办法从实例方法更新值

型号:

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

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

  • 使用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); 
}); 
+0

谢谢。我认为它更高效,因此生成了UUID。然而,你的答案对我来说是一个很好的学习经验,我相信迟早会出现一个用例。 – Aaron

相关问题