2015-12-14 10 views
15

Così inizio la mia avventura in tutte le cose Nodo. Uno degli strumenti che sto cercando di imparare è Sequelize. Così ho partirà quello che stavo cercando di fare:Sequelize classMethods vs instanceMethods

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

Sono confuso su quando utilizzare classMethods vs instanceMethods. Per me, quando penso a createSalt() e hashPassword() dovrebbero essere metodi di classe. Sono generali e per la maggior parte non hanno davvero nulla a che fare con l'istanza specifica in cui sono usati in generale. Ma quando ho createSalt() e hashPassword() in classMethods non posso chiamarli da instanceMethods.

ho provato le variazioni delle seguenti operazioni:

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

Qualcosa come di seguito non funzionerà e io sono probabilmente solo non capire qualcosa di semplice.

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

Qualsiasi suggerimento/consiglio/direzione sarebbe molto apprezzato!

risposta

21

Tutto il metodo che non modificare o controllare qualsiasi tipo di istanza dovrebbe essere classmethod e il resto instanceMethod

es:

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

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

+0

che ha senso per me e questo è quello che tipo di pensato funzioni in modo generale, come makeSalt() e hashPassword() dovrebbe essere metodi di classe, perché davvero hanno niente a che fare con l'istanza specifica. COSÌ ho detto ora che il mio vero problema credo non sia in grado di chiamare una classe Methond all'interno del mio instanceMethod e non sono sicuro di quale sia l'accordo. – Silent

+0

Sono entrato nell'IRC e sono stati in grado di aiutarmi. È un po 'diverso da quello che uso anche in altre lingue, ma è solo una parte del processo di apprendimento! dato che è un metodo di classe, diventa parte del modello, quindi non devi usare qualcosa come "questo". lo chiamate semplicemente come "User.getSalt()", quindi tutto funziona ora come mi sarei aspettato! – Silent

+0

Apprezzo il tuo aiuto! – Silent

1

Anche se le basi sono che instance i metodi devono essere utilizzati quando si desidera modificare il valore instance (ergo row). Preferisco non inquinare il classMethods con metodi che non usano lo stesso class (ergo the table).

Nel tuo esempio vorrei mettere hashPassword funzione di fuori della classe e di lasciarlo come una funzione di supporto da qualche parte nel mio modulo utility (non o perché lo stesso modulo, ma come una funzione definita normale) ... come

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

... 

... 

    instanceMethods: { 
    authenticate: function(...) { hashPassword(...) } 
    } 
+0

Mi chiedevo anche di farlo. Penso che andrò avanti e lo farò solo per prendere l'abitudine di farlo. Non potrei decidere se ha fatto da quando lo separo o no dato che userò solo hashPassword all'interno del modello User. – Silent

1

ho trovato questo ha lavorato per me come di sequelize 3,14

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

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