Итак, начинаю свое приключение во всех вещах, 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 против 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;
}

Любые намеки / советы / направления будут очень благодарны!

17
Silent 14 Дек 2015 в 05:34

3 ответа

Лучший ответ

Все методы, которые не изменяют и не проверяют экземпляры любого типа, должны быть classMethod, а остальные instanceMethod

Пример:

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

// Should be a instanceMethods
function checkMyName() {
  return this.name === "george";
}
25
Yves M. 18 Июл 2018 в 08:41

Хотя основы в том, что instance методы должны использоваться, когда вы хотите изменить свой instance (строка ergo). Я бы предпочел не загрязнять classMethods методами, которые не используют сам class (т.е. таблицу).

В вашем примере я поместил бы функцию hashPassword вне вашего класса и оставил бы ее в качестве вспомогательной функции где-нибудь в моем модуле утилит (или почему бы не тот же модуль, а как обычную определенную функцию) ... как

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

...

...

  instanceMethods: { 
     authenticate: function( ... ) { hashPassword( ... ) }
  }
1
drinchev 14 Дек 2015 в 22:16

Я обнаружил, что это работает для меня на Sequelize 3.14

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

}, {
  classMethods: {
    someClassMethod: function() {
      return true;
    }
}, {
  instanceMethods: {
    callClassMethod: function() {
      myModel.someClassMethod();
    }
  }
});
1
Mario Olivio Flores 30 Июн 2016 в 09:09