Sequelize classMethods vs instanceMethods

时间:2015-12-14 02:34:46

标签: javascript node.js orm sequelize.js

所以开始我的所有事情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;
}

任何提示/提示/方向都非常值得赞赏!

3 个答案:

答案 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();
    }
  }
});