Sequelize classMethods vs instanceMethods
Итак, начинаем свое приключение во всех вещах 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;
};
Ответы
Ответ 1
Все методы, которые не изменяют или не проверяют какой-либо тип экземпляра, должны быть classMethod, а остальные instanceMethod
Пример:
//should be a classMethods
function getMyFriends() {
return this.find({where{...}})
}
//should be a instanceMethods
function checkMyName() {
return this.name === "george";
}
Ответ 2
Хотя основы заключаются в том, что методы instance
должны использоваться, когда вы хотите изменить свою instance
(эрго-строку). Я бы предпочел не загрязнять classMethods
методами, которые не используют class
(ergo the table).
В вашем примере я бы поставил функцию hashPassword
вне вашего класса и оставил ее как вспомогательную функцию где-нибудь в моем модуле утилит (или почему не тот же модуль, но как нормальная определенная функция)... например
var hashPassword = function(...) { ... }
...
...
instanceMethods: {
authenticate: function( ... ) { hashPassword( ... ) }
}
Ответ 3
Я нашел, что это сработало для меня, как о продолжении 3.14
var myModel = sequelize.define('model', {
}, {
classMethods: {
someClassMethod: function() {
return true;
}
}, {
instanceMethods: {
callClassMethod: function() {
myModel.someClassMethod();
}
}
});