2017-03-04 14 views
0

アカウント作成後に列に値を追加しようとしていますが、これをモデルのインスタンスメソッドから実行したいと思います。私は典型的な方法でサービス内のアカウントを作成しています。また、後で生成したユーザーIDを、ユーザーごとのユーザー表にも格納されている別の生成IDと連結するために使用します。私は基本的に次のようにユーザーが作成されると、インスタンスメソッドを呼び出すしたいと思います: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

次の2つの方法

    でそれを行うことができます
  • 新しいインスタンスの作成直後に実行される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

関連する問題