find विधि एक कर्सर लौटाती है, न कि वस्तु और न ही सरणी। ऑब्जेक्ट को एक्सेस करने के लिए, आपको या तो इसे कर्सर से लाना होगा
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
या इसे सीधे findOne . के साथ प्राप्त करें :
var skill = Skills.findOne(Session.get('selected_skill'));
फिर आप इसे किसी अन्य जेएस ऑब्जेक्ट की तरह ही इस्तेमाल कर सकते हैं:
console.log(skill.mana);
skill._cache = {cooldown: true};
ध्यान रखें कि क्लाइंट-साइड पर, संग्रह विधियां जैसे find गैर-अवरुद्ध हैं। उल्का जो कुछ भी कैश में है, वे वापस लौटाते हैं, जरूरी नहीं कि सर्वर-साइड डीबी में क्या है। इसलिए आपको उन्हें हमेशा एक प्रतिक्रियाशील संदर्भ में उपयोग करना चाहिए, या यह सुनिश्चित करना चाहिए कि सभी डेटा निष्पादन से पहले प्राप्त किया गया है (बाद के बारे में चिंता न करें जब तक कि आप उल्का के साथ धाराप्रवाह न हों, पहले तरीके से शुरू करें)।
साथ ही, आपको यह भी ध्यान रखना होगा कि इस वजह से findOne और find.fetch null लौटा सकता है / खाली सरणी, तब भी जब संबंधित तत्व डीबी में है (लेकिन अभी तक कैश नहीं किया गया है)। यदि आप अपने प्रतिक्रियाशील कार्यों में इसे ध्यान में नहीं रखते हैं, तो आप त्रुटियों में भाग लेंगे।
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
अगर हम if(!article) . के साथ फंक्शन से नहीं बच पाए , व्यंजक article.title article . के रूप में पहली गणना में त्रुटि उत्पन्न करेगा अपरिभाषित होगा (यह मानते हुए कि इसे पहले कैश नहीं किया गया था)।
जब आप क्लाइंट साइड से डेटाबेस को अपडेट करना चाहते हैं, तो आप एक बार में केवल एक आइटम को बदल सकते हैं, और आपको आइटम को इसके _id द्वारा संदर्भित करना होगा। . यह सुरक्षा कारणों से है। इसके लिए आपकी लाइन ठीक थी:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert() एक फ़ंक्शन है जो लौटाता है अपरिभाषित कोई फर्क नहीं पड़ता कि आप इसे क्या खिलाते हैं।
alert(42); // -> undefined
आम तौर पर, यह दूर होता है console.log के साथ डिबग करना बेहतर है alert . की तुलना में ।