2012-09-01 14 views
33

उल्का का उपयोग करते हुए, मैं समझने का प्रयास कर रहा हूं कि सर्वर-साइड Meteor.methods() का उपयोग कब करें, जबकि अभी भी तत्काल यूआई अपडेट बनाए रखें।Meteor.methods का उपयोग करने और स्टब्स का उपयोग करने के लिए

एंड्रयू स्काला के introductory tutorial से, वह दावा है कि Meteor.methods() इस्तेमाल किया जाना चाहिए जब आप अद्यतन करने और अपने डेटाबेस दस्तावेजों को संशोधित करना चाहते:

विचार है कि आपको लगता है कि खतरनाक चीजें करते सर्वर पर सभी कार्यों को परिभाषित है डेटा को संशोधित और अद्यतन करने की तरह, और उसके बाद क्लाइंट उन कार्यों को कॉल करें और नियमित कार्यों जैसे वापसी मान प्राप्त करें। क्लाइंट कार्यान्वयन को कभी नहीं देखता है और व्यक्तिगत रूप से डेटा को संशोधित नहीं करता है। सर्वर सभी काम करता है।

और यह सलाह के बाद, मैं अपने कोड में यह लागू किया:

सर्वर साइड:

Meteor.methods({ 

    addMovie: function(data) { 
    var movie = Movies.insert({name: data}); 
    return movie; 
    }, 

    ... 

क्लाइंट-साइड:

Template.movies.events = ({ 

    'click #add-movie': function(e) { 

    var name = document.getElementById('movie-name').value; 
    Meteor.call('addMovie', name); 

    return false; 

    }, 

    ... 

यह काम करता है, लेकिन यह धीमी है । यूआई तुरंत अपडेट नहीं होता है अगर आप क्लाइंट-साइड पर Movies.insert() कहलाते हैं। docs संकेत मिलता है कि, समस्या को सुधारने के लिए, आप स्टब्स क्लाइंट-साइड पर बना सकते हैं:

ग्राहक पर

कॉलिंग तरीकों एक ही नाम के सर्वर तरीकों के साथ जुड़े ठूंठ कार्यों को परिभाषित करता है। यदि आप नहीं चाहते हैं तो आपको अपनी विधि के लिए स्टब को परिभाषित करने की आवश्यकता नहीं है। उस स्थिति में, विधि कॉल केवल अन्य सिस्टम में दूरस्थ प्रक्रिया कॉल की तरह हैं, और आपको सर्वर से परिणामों के लिए का इंतजार करना होगा।

लेकिन इन स्टब्स को कैसा दिखना चाहिए? क्या यह मूल रूप से सर्वर-साइड विधि के समान दिखना चाहिए? यदि हां, तो बात क्या है? मैं Meteor.methods() के उपयोग और उद्देश्य, स्टब्स के बिंदु/उपयोग, और उनके कार्यान्वयन के अधिक व्यापक स्पष्टीकरण की तलाश में हूं।

संपादित करें: डेविड ग्रीनस्पैन ने meteor-talk पर Meteor.methods() और स्टब्स के उपयोग को स्पष्ट करने में मदद की है।

+1

क्या आप डेविड के उत्तर से खुश हैं? यदि ऐसा है, तो बस इसे एक उत्तर के रूप में पोस्ट करें और इसे स्वीकार करें। –

उत्तर

19

यहाँ एक और उदाहरण है।

कहता है कि आप एक बिंगो गेम लिख रहे हैं और आप "हाउस!" कॉल करने के लिए बटन पर क्लिक करें .. क्लिक ईवेंट में आप एक विधि कॉल कर सकते हैं, उदा।

Method.call("callHouse"); 

इस सर्वर विधि लागू करेगा:

// on the server 
Meteor.methods({ 
    callHouse: function() { 
    if (currentGame.isInProgress) { 
     currentGame.winner = this.userId; 
     currentGame.end(); 
    } 
    } 
}); 

अगर आप पहले "घर" कॉल करने के लिए कर रहे हैं, विधि विजेता के रूप में आप का प्रतीक होगा लेकिन .., चलो बहाना विधि अत्यंत है चलो धीमा और आपका ग्राहक ऐप इंतजार कर रहा है .. आप 99% सुनिश्चित हैं कि सर्वर पुष्टि करेगा कि आप विजेता हैं - आप बस बिना प्रतीक्षा किए उपयोगकर्ता की स्क्रीन अपडेट करना चाहते हैं .. इस मामले में क्लाइंट-साइड स्टब को लागू करें:

// on the client 
Meteor.methods({ 
    callHouse: function() { 
    currentGame.winner = Meteor.userId(); 
    // add any other side-effects you expect to occur here 
    } 
}); 

जब सर्वर परिणाम लौटाता है, यदि आपके द्वारा स्टब में सेट किए गए डेटा से भिन्न होता है, तो यह इसे सही करेगा और स्क्रीन के अनुसार रीफ्रेश करेगा।

+0

आपने सर्वर पर 'this.userId' और क्लाइंट पर' Meteor.userId() 'का उपयोग क्यों किया? – CaptSaltyJack

+0

मुझे याद नहीं है, मैंने मेटियर वर्ष पहले – Lloyd

+4

को पिन किया है यह बहुत बुरा है। 1.0 चट्टानों! – CaptSaltyJack

12

संक्षेप में:

फाइलों में कुछ तरीकों (Meteor.methods) को परिभाषित करें Sever कि सर्वर पर वास्तविक काम करना होगा, को परिभाषित फाइलों में कुछ तरीकों (Meteor.methods) को धक्का दे करने के लिए धक्का दिया ग्राहक (इस तरह के एक लोड हो रहा है संकेत के रूप में) ग्राहक पर एक 'तत्काल' व्यवहार पाने के लिए जब तक सर्वर क्लाइंट

यहाँ डेविड की मूल पोस्ट है वापस करने के लिए जिसके परिणामस्वरूप परिवर्तन धक्का:

हाय बेन,

सिद्धांत रूप में, एक विधि क्लाइंट और सर्वर पर पूरी तरह से अलग-अलग कार्रवाइयां कर सकती है, उदाहरण के लिए क्लाइंट पर लोडिंग संकेतक दिखा रहा है और सर्वर पर रिमोट एपीआई से बात कर रहा है। उल्का कॉल करता है।क्लाइंट के तरीके क्लाइंट व्यवहार को परिभाषित करते हैं, और सर्वर पर Meteor.methods सर्वर व्यवहार को परिभाषित करते हैं।

डेटाबेस पर संचालित विधियों के लिए, अक्सर कार्यान्वयन दोनों के लिए किया जाएगा। क्लाइंट संस्करण क्लाइंट-साइड डेटाबेस ( सब्सक्राइब किए गए दस्तावेज़ों का ब्राउज़र-पक्ष "कैश" प्रभावित करता है और सर्वर-साइड संस्करण वास्तविक डेटाबेस को प्रभावित करता है। जब क्लाइंट वापस सुनता है, तो सर्वर-साइड उत्परिवर्तन के परिणामस्वरूप यह "स्नैप" होता है; क्लाइंट-साइड डेटाबेस उत्परिवर्तनों को त्याग दिया जाता है (या पूर्ववत है, इस पर निर्भर करता है कि आप इसके बारे में क्या सोचते हैं)। यदि क्लाइंट-साइड विधि अन्य विधियों को कॉल करती है, तो इन माध्यमिक कॉल सर्वर पर रिमोट किए गए हैं। सर्वर-साइड संस्करण या तो सर्वर पर, या नहीं, जैसा कि यह फिट दिखाई देता है, वही विधियों को कॉल करेगा।

तो आपके द्वारा प्रदान की जाने वाली क्लाइंट-साइड विधि केवल एक "सिमुलेशन" है और सटीक नहीं है (यह संभव नहीं हो सकता है)। आशा है कि आप आमतौर पर सिमुलेशन इम्प्लेशन मुफ्त में प्राप्त करते हैं क्योंकि यह सर्वर के रूप में समान है!

क्या यह आपके प्रश्न का उत्तर देता है?

- डेविड

+0

धन्यवाद जय। एक बार मुझे स्टब्स से निपटने का अधिक अनुभव होने के बाद, इसका एक फॉलोअप जवाब लिखने का अर्थ रहा। मैं अंत में ऐसा कर सकता हूं, लेकिन अब मैं आपका जवाब स्वीकार करूंगा। – bento

+0

@jay, क्या क्लाइंट और सर्वर (क्लाइंट और सर्वर फ़ोल्डरों के बाहर) दोनों के लिए एक विधि का उपयोग करना एक ही प्रभाव होगा? – securecurve

+2

हाय @securecurve स्टब केवल ग्राहक तत्काल अद्यतन के लिए है, और सर्वर के ऑपरेशन करने के बाद इसका परिणाम ओवरराइट हो जाएगा और लौटाया जाएगा। उदाहरण के लिए, यदि आपके पास अपने क्लाइंट पर अपवॉट विधि है, तो आप केवल वोटों में 1 जोड़ सकते हैं, और यूआई अपडेट कर सकते हैं, लेकिन साथ ही, मेटियर सर्वर पर एक ही विधि को कॉल करेगा (जो हो सकता है या नहीं अन्य लोगों ने उदाहरण के लिए मतदान किया है, तो उसी परिणाम को वापस करें) – jay

3

यदि आप क्लाइंट/सर्वर जैसे /collections द्वारा साझा की गई फ़ाइल पर कोई विधि परिभाषित करते हैं, तो यह दोनों के लिए सुलभ नहीं होगा और स्वचालित रूप से स्टब नहीं होगा?

तो:

/collections/houses.js

Meteor.methods({ 
    callHouse: function() { 
    if (currentGame.isInProgress) { 
     currentGame.winner = this.userId; 
     currentGame.end(); 
    } 
    } 
}); 

यह दोनों क्लाइंट और सर्वर के लिए उपलब्ध हो जाएगा। यदि यह पास नहीं होता है, तो सर्वर क्लाइंट अपडेट को स्वचालित रूप से अस्वीकार कर देगा/इसे वापस लाएगा।

+0

क्या यह सुरक्षित है? चूंकि उपयोगकर्ता को –

+0

कोड तक पहुंच है, इसलिए आप इसके लिए उल्का सुरक्षा नियमों का उपयोग करते हैं। –

+0

@ ब्रूनोलेमोस मुझे शुरुआत में भी चिंता थी, लेकिन उल्का के पीछे डिजाइन सिद्धांतों का हिस्सा यह है कि यह हर जगह डेटाबेस है, इसलिए आप क्लाइंट और सर्वर से अपने डेटाबेस तक पहुंचने के लिए एक ही तरीके का उपयोग कर सकते हैं। इससे कोई फर्क नहीं पड़ता कि क्लाइंट के पास कोड तक पहुंच है, क्योंकि क्लाइंट-साइड पर कोई फर्क नहीं पड़ता, सर्वर-साइड हमेशा मान्य होगा। – d4nyll

3

जैसा कि डैनियल ने कहा है कि आप उस फ़ाइल पर एक विधि परिभाषित कर सकते हैं जो क्लाइंट या सर्वर निर्देशिका में नहीं है और दोनों तरफ उपलब्ध है। अतिरिक्त जांच करने के लिए आप isSimulation बूलियन मान का भी उपयोग कर सकते हैं।

Meteor.methods({ 
    addMovie: function (movieData) { 
    if (!this.isSimulation) { 
     check(movieData, someAdditionaCheckinFunc); 
    } 
    Movies.insert(movieData); 
    } 
}) 

इस प्रकार सशर्त शाखा में कोड केवल सर्वर पर निष्पादित किया जाएगा: उदाहरण के लिए यह कुछ इस तरह दिखता हो सकता है।

संबंधित मुद्दे