web-dev-qa-db-fra.com

Sequelize classMethods vs instanceMethods

Commençant ainsi mon aventure dans toutes les choses Node. L'un des outils que j'essaie d'apprendre est Sequelize. Je vais donc commencer ce que j'essayais de faire:

'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;
};

Je ne sais pas quand utiliser classMethods vs instanceMethods. Pour moi, quand je pense à createSalt() et hashPassword() devraient être des méthodes de classe. Ils sont généraux et n'ont pour la plupart rien à voir avec l'instance spécifique qu'ils sont simplement utilisés en général. Mais quand j'ai createSalt() et hashPassword() dans classMethods je ne peux pas les appeler depuis instanceMethods.

J'ai essayé des variantes des éléments suivants:

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

Quelque chose comme ci-dessous ne fonctionnera pas et je ne comprends probablement pas quelque chose de simple.

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

Tous les conseils/conseils/direction seraient très appréciés!

17
Silent

Toutes les méthodes qui ne modifient ou ne vérifient aucun type d'instance doivent être classMethod et le reste instanceMethod

ex:

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

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

Bien que l'essentiel soit que les méthodes instance doivent être utilisées lorsque vous souhaitez modifier votre instance (ligne ergo). Je préfère ne pas polluer le classMethods avec des méthodes qui n'utilisent pas le class (ergo la table) lui-même.

Dans votre exemple, je mettrais la fonction hashPassword en dehors de votre classe et la laisserais comme une fonction d'assistance quelque part dans mon module utilitaires (ou pourquoi pas le même module mais comme une fonction définie normale) ... comme

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

...

...

  instanceMethods: { 
     authenticate: function( ... ) { hashPassword( ... ) }
  }
1
drinchev

J'ai trouvé que cela fonctionnait pour moi à partir de la suite 3.14

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

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