2015-12-14 12 views
15

それで、すべてのものに自分の冒険を始めるNode。私が学ぶことを試みているツールの1つはSequelizeです。だから私は、私がやろうとしていたものから始めます:Sequelize classMethodsとinstanceMethods

'use strict'; 
 
var crypto = require('crypto'); 
 

 
module.exports = function(sequelize, DataTypes) { 
 
    var User = sequelize.define('User', { 
 
    username: DataTypes.STRING, 
 
    first_name: DataTypes.STRING, 
 
    last_name: DataTypes.STRING, 
 
    salt: DataTypes.STRING, 
 
    hashed_pwd: DataTypes.STRING 
 
    }, { 
 
    classMethods: { 
 

 
    }, 
 
    instanceMethods: { 
 
     createSalt: function() { 
 
     return crypto.randomBytes(128).toString('base64'); 
 
     }, 
 
     hashPassword: function(salt, pwd) { 
 
     var hmac = crypto.createHmac('sha1', salt); 
 

 
     return hmac.update(pwd).digest('hex'); 
 
     }, 
 
     authenticate: function(passwordToMatch) { 
 
     return this.hashPassword(this.salt, passwordToMatch) === this.hashed_pwd; 
 
     } 
 
    } 
 
    }); 
 
    return User; 
 
};

私はinstanceMethods対クラスメソッドを使用する際に混乱しています。私がcreateSalt()とhashPassword()について考えるとき、私にはクラスメソッドでなければなりません。彼らは一般的で、ほとんどの場合、実際に使用されている特定のインスタンスとは何の関係もありません。しかし、私がcreateSalt()とhashPassword()をclassMethodsで使用すると、instanceMethodsからそれらを呼び出すことはできません。

私は、次のバリエーションを試してみました:

this.createSalt(); 
this.classMethods.createSalt(); 
createSalt(); 

文句を言わない作業以下のようなものを、私はおそらく、単純な何かを理解していないです。

authenticate: function(passwordToMatch) { 
    console.log(this.createSalt()); 
    return this.hashPassword(this.salt, passwordToMatch) === this.hashed_pwd; 
} 

ヒント/ヒント/方向は非常に高く評価されます。基本はinstanceことですが

//should be a classMethods 
 
function getMyFriends() { 
 
    return this.find({where{...}}) 
 
} 
 

 
//should be a instanceMethods 
 
function checkMyName() { 
 
    return this.name === "george"; 
 
}

答えて

21

EXをinstanceMethod instance(ergo行)を変更する場合は、メソッドを使用する必要があります。私はむしろ、class(テーブル自体)を使用しない方法でclassMethodsを汚染しないでください。あなたの例では

私はあなたのクラスの外hashPassword機能を入れて、どこかに私のユーティリティモジュール内のヘルパー関数としてそれを残して(又は同意しない理由は、同じモジュールが、通常の定義関数など)でしょう...などの

var hashPassword = function(...) { ... } 

... 

... 

    instanceMethods: { 
    authenticate: function(...) { hashPassword(...) } 
    } 
+0

のように私のために働きました特定のインスタンスとは関係ありません。だから今私の本当の問題は、私はinstanceMethod内でclassMethondを呼び出すことができず、取引が何であるかわからないと言いました。 – Silent

+0

私はIRCを手に入れました。彼らは私を助けてくれました。その少し違って、私は他の言語でも使用していますが、それは学習プロセスの一部です!そのクラスメソッドからはモデルの一部になるので、 "this"のようなものを使う必要はありません。あなたは単に "User.getSalt()"のように呼び出すので、私は期待していたようにすべて動作します! – Silent

+0

私はあなたの助けに感謝します! – Silent

1

:インスタンスのいずれかのタイプを変更するか、チェックしていないすべてのメソッドがクラスメソッドと休息する必要があります

+0

私はそれについてもやってみた。私は先に進んで、そうする癖をつけるためにそれをやると思います。 Userモデル内でhashPasswordを使用するだけなので、それを分離してから作成したかどうかは決めることができませんでした。 – Silent

1

は、私は、これは私には理にかなっているし、彼らが本当に持っているので、クラスメソッドでなければなりません)私は一種のようにmakeSalt()とhashPassword(ように一般的な機能を考え出し厥sequelize 3.14

var myModel = sequelize.define('model', { 

}, { 
    classMethods: { 
    someClassMethod: function() { 
     return true; 
    } 
}, { 
    instanceMethods: { 
    callClassMethod: function() { 
     myModel.someClassMethod(); 
    } 
    } 
});