所以开始我的所有事情Node的冒险。我正在努力学习的工具之一是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
vs 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;
}
任何提示/提示/方向都非常值得赞赏!
答案 0 :(得分:25)
所有不修改或检查任何类型实例的方法都应为classMethod
,其余instanceMethod
例如:
// Should be a classMethods
function getMyFriends() {
return this.find({where{...}})
}
// Should be a instanceMethods
function checkMyName() {
return this.name === "george";
}
答案 1 :(得分:1)
虽然基础知识是在您想要修改instance
(ergo行)时应使用instance
方法。我宁愿不使用不使用classMethods
(表格本身)的方法来污染class
。
在您的示例中,我将hashPassword
函数放在您的类之外,并将其作为辅助函数保留在我的实用程序模块中(或者为什么不是相同的模块,而是作为正常定义的函数)...喜欢
var hashPassword = function(...) { ... }
...
...
instanceMethods: {
authenticate: function( ... ) { hashPassword( ... ) }
}
答案 2 :(得分:1)
我发现这对我来说是sequelize 3.14
var myModel = sequelize.define('model', {
}, {
classMethods: {
someClassMethod: function() {
return true;
}
}, {
instanceMethods: {
callClassMethod: function() {
myModel.someClassMethod();
}
}
});