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!
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";
}
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( ... ) }
}
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();
}
}
});