2015-12-14 14 views
15

Vì vậy, bắt đầu cuộc phiêu lưu của tôi vào tất cả mọi thứ Node. Một trong những công cụ mà tôi đang cố gắng tìm hiểu là Sequelize. Vì vậy, tôi sẽ bắt đầu tắt những gì tôi đã cố gắng để làm:Phân tích lại lớpMethods 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; 
 
};

Tôi đang bối rối trên khi sử dụng classMethods vs instanceMethods. Với tôi khi tôi nghĩ về createSalt() và hashPassword() nên là các phương thức lớp. Họ là chung và cho hầu hết các phần không thực sự có bất cứ điều gì để làm với các trường hợp cụ thể họ chỉ được sử dụng nói chung. Nhưng khi tôi có createSalt() và hashPassword() trong classMethods tôi không thể gọi chúng từ instanceMethods.

Tôi đã cố gắng biến những điều sau đây:

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

Something như dưới đây wont work và tôi có lẽ chỉ không hiểu một cái gì đó đơn giản.

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

Mọi gợi ý/mẹo/hướng sẽ được đánh giá rất cao!

Trả lời

21

Tất cả các phương pháp người không sửa đổi hoặc kiểm tra bất kỳ loại dụ nên classmethod và phần còn lại instanceMethod

ví dụ:

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

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

+0

điều đó làm cho ý nghĩa với tôi và đó là những gì tôi loại hình chức năng quá chung chung như makeSalt() và hashPassword() nên phương pháp lớp học bởi vì họ thực sự có không liên quan gì đến ví dụ cụ thể. SO cho biết bây giờ vấn đề thực sự của tôi, tôi đoán là không thể gọi một classMethond bên trong instanceMethod của tôi và không chắc chắn những gì là thỏa thuận. – Silent

+0

Tôi đã tham gia IRC và họ có thể giúp tôi. Một chút khác biệt của nó sau đó tôi cũng sử dụng các ngôn ngữ khác nhưng đó chỉ là một phần của quá trình học tập! vì nó là một phương thức lớp, nó trở thành một phần của mô hình, do đó bạn không phải sử dụng một cái gì đó như "cái này". bạn chỉ cần gọi nó là "User.getSalt()" vì vậy tất cả đều hoạt động như tôi mong đợi! – Silent

+0

Tôi đánh giá cao sự giúp đỡ của bạn! – Silent

1

Mặc dù những điều cơ bản là rằng instance phương pháp nên được sử dụng khi bạn muốn sửa đổi instance (hàng của bạn). Tôi không muốn gây ô nhiễm cho số classMethods với các phương pháp không sử dụng chính trang class (ergo the table).

Trong ví dụ của bạn tôi sẽ đưa hashPassword chức năng bên ngoài lớp học của bạn và để nó như một hàm helper ở đâu đó trong mô-đun tiện ích của tôi (hoặc tại sao không phải là mô-đun tương tự nhưng là một chức năng được xác định bình thường) ... như

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

... 

... 

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

Tôi tự hỏi về việc đó. Tôi nghĩ rằng tôi sẽ đi trước và làm điều đó chỉ để có thói quen làm như vậy. Tôi không thể quyết định nếu nó được thực hiện kể từ khi tách nó ra hay không vì tôi sẽ chỉ sử dụng hashPassword trong mô hình User. – Silent

1

tôi thấy điều này làm việc cho tôi như là của sequelize 3,14

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

}, { 
    classMethods: { 
    someClassMethod: function() { 
     return true; 
    } 
}, { 
    instanceMethods: { 
    callClassMethod: function() { 
     myModel.someClassMethod(); 
    } 
    } 
}); 
Các vấn đề liên quan