2015-12-14 9 views
15

तो मेरे साहस को नोड में सभी चीजों में शुरू करना। मैं जिस टूल को सीखने की कोशिश कर रहा हूं वह एक है 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; 
 
};

मैं जब बनाम instanceMethods classMethods का उपयोग करने पर उलझन में हूँ। मेरे लिए जब मैं createSalt() और हैशपास्वर्ड() के बारे में सोचता हूं तो क्लास विधियां होनी चाहिए। वे सामान्य हैं और अधिकांश भाग के लिए वास्तव में विशिष्ट उदाहरण के साथ कुछ भी नहीं करना है, जिनका उपयोग सामान्य रूप से किया जाता है। लेकिन जब मैंने classMethods मेंSalt() और हैशपैसवर्ड() बनाया है, तो मैं उन्हें exampleMethods से कॉल नहीं कर सकता।

मैं निम्नलिखित के रूपांतरों की कोशिश की है: अभ्यस्त काम नीचे

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

कुछ की तरह है और मैं शायद बस कुछ सरल समझ नहीं कर रहा हूँ।

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

कोई भी संकेत/सुझाव/दिशा बहुत सराहना की जाएगी!

उत्तर

21

सभी विधि जो संशोधित करने या उदाहरण के किसी भी प्रकार की जांच classMethod और बाकी होना चाहिए नहीं है instanceMethod

पूर्व:

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

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

+0

मेरे लिए समझ में आता है और thats क्या मैं एक तरह से इस तरह के makeSalt() और hashPassword (के रूप में लगा तो सामान्य कार्यों) वर्ग तरीकों से किया जाना चाहिए, क्योंकि वे वास्तव में है कि के रूप में मेरे लिए काम किया विशिष्ट उदाहरण के साथ कुछ भी नहीं करना है। तो अब कहा कि मेरी असली समस्या मुझे लगता है कि मेरे उदाहरण के अंदर एक वर्ग मेथॉन्ड को कॉल करने में सक्षम नहीं है विधि और यह सुनिश्चित नहीं है कि सौदा क्या है। – Silent

+0

मुझे आईआरसी पर मिला और वे मेरी मदद करने में सक्षम थे। यह थोड़ा अलग है तो मैं अन्य भाषाओं में भी उपयोग कर रहा हूं लेकिन यह सिर्फ सीखने की प्रक्रिया का हिस्सा है! चूंकि इसकी कक्षा विधि यह मॉडल का हिस्सा बन जाती है, इसलिए आपको "इस" जैसे कुछ का उपयोग नहीं करना पड़ेगा। आप बस इसे "User.getSalt()" कहते हैं, इसलिए यह सब अब काम कर रहा है जैसा कि मैंने उम्मीद की थी! – Silent

+0

मैं आपकी मदद की सराहना करता हूं! – Silent

1

हालांकि मूल बातें कर रहे हैं instance जब आप अपने instance (ergo पंक्ति) को संशोधित करना चाहते हैं तो विधियों का उपयोग किया जाना चाहिए। मैं उन तरीकों के साथ classMethods को प्रदूषित नहीं करूंगा जो class (तालिका को मिटाएं) का उपयोग नहीं करते हैं।

अपने उदाहरण में मैं अपनी कक्षा के बाहर hashPassword समारोह रख दिया और मेरी उपयोगिताओं मॉड्यूल में कहीं न कहीं एक सहायक समारोह के रूप में (या क्यों नहीं एक ही मॉड्यूल लेकिन एक सामान्य परिभाषित समारोह के रूप में) इसे छोड़ ... की तरह

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

... 

... 

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

मुझे यह करने के बारे में भी आश्चर्य हुआ। मुझे लगता है कि मैं आगे बढ़ूंगा और ऐसा करने की आदत पाने के लिए इसे करूँगा। मैं यह तय नहीं कर सका कि इसे अलग करने के बाद से बनाया गया है या नहीं, क्योंकि मैं केवल उपयोगकर्ता मॉडल के भीतर हैश पासवर्ड का उपयोग करूंगा। – Silent

1

मैंने पाया इस sequelize 3,14

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

}, { 
    classMethods: { 
    someClassMethod: function() { 
     return true; 
    } 
}, { 
    instanceMethods: { 
    callClassMethod: function() { 
     myModel.someClassMethod(); 
    } 
    } 
}); 
संबंधित मुद्दे