それでNodeのすべてのものへの冒険を始めました。私が学ぼうとしているツールの1つはSequelizeです。それで、私がやろうとしていたことから始めます:
_'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;
};
_
classMethods
対instanceMethods
を使用するタイミングについて混乱しています。 createSalt()
とhashPassword()
について考えるとき、クラスメソッドである必要があります。それらは一般的なものであり、ほとんどの場合、単に一般的に使用されている特定のインスタンスとは関係ありません。しかし、classMethods
にcreateSalt()
とhashPassword()
がある場合、instanceMethods
から呼び出すことはできません。
次のバリエーションを試しました。
_this.createSalt();
this.classMethods.createSalt();
createSalt();
_
以下のようなものはうまくいかず、おそらく単純なものを理解していないだけです。
_authenticate: function(passwordToMatch) {
console.log(this.createSalt());
return this.hashPassword(this.salt, passwordToMatch) === this.hashed_pwd;
}
_
ヒント/ヒント/方向は非常に高く評価されます!
インスタンスのタイプを変更またはチェックしないメソッドはすべてclassMethod
で、残りはinstanceMethod
でなければなりません
例:
// Should be a classMethods
function getMyFriends() {
return this.find({where{...}})
}
// Should be a instanceMethods
function checkMyName() {
return this.name === "george";
}
基本的には、instance
(ergo row)を変更する場合は、instance
メソッドを使用する必要があります。 classMethods
(ergo the table)自体を使用しないメソッドでclass
を汚染したくない。
あなたの例では、クラスの外にhashPassword
関数を配置し、ユーティリティモジュールのどこかにヘルパー関数として残します(または、同じモジュールではなく通常の定義関数として)...のように
var hashPassword = function(...) { ... }
...
...
instanceMethods: {
authenticate: function( ... ) { hashPassword( ... ) }
}
私はこれがsequelize 3.14の時点で私のために働いたことを発見しました
var myModel = sequelize.define('model', {
}, {
classMethods: {
someClassMethod: function() {
return true;
}
}, {
instanceMethods: {
callClassMethod: function() {
myModel.someClassMethod();
}
}
});