2012-04-26 7 views
15

एक्सप्रेस एक सर्वर साइड सत्र ऑब्जेक्ट लागू करता है जो आपको क्लाइंट को विशिष्ट डेटा स्टोर करने देता है। आप मौसम में समकक्ष कैसे करेंगे?आप मेटर में क्लाइंट के लिए विशिष्ट डेटा सर्वर पक्ष कैसे संग्रहीत करते हैं?

स्टैक संग्रह का उपयोग करके अनुशंसित। यह काम करेगा यदि संग्रह में ऑब्जेक्ट्स की आईडी सत्र_आईड्स थीं जो कनेक्शन ऑब्जेक्ट्स पर सर्वर और क्लाइंट पक्ष दोनों का खुलासा करती थीं।

if (typeof (msg.session) === "string") { 
    var reconnected = (self.last_session_id === msg.session); 
    self.last_session_id = msg.session; 
} 

और सर्वर पर LivedataSession वस्तु:

यह क्लाइंट और सर्वर शेयर क्लाइंट पर LivedataConnection के माध्यम से एक session_id प्रकट होता है

self.id = Meteor.uuid(); 

लेकिन उल्का एपीआई का खुलासा नहीं करता इन वस्तुओं। सत्र जानकारी तक पहुंचने का सही तरीका क्या है?

यह क्लाइंट का सत्र ऑब्जेक्ट सर्वर सर्वर साइड ऑब्जेक्ट के साथ सिंक हो गया है जो क्लाइंट के लिए अद्वितीय है जो मीटरी # प्रकाशन और उल्का # विधियों से सुलभ है।

+1

+1। मैंने माना कि यह इस तरह से काम करता है, और उलझन में था कि यह काम नहीं कर रहा था – 7zark7

उत्तर

-1

मुझे लगता है कि Session उल्का में है - क्लाइंट पक्ष पर आवश्यक जानकारी संग्रहीत करने के लिए।

आप सर्वर के लिए कुछ पारित करने के लिए की जरूरत है, हो सकता है यह एक उल्का संग्रह में डाल ?:

Cookies = new Meteor.collection("cookies") 

अन्यथा, बस Session का उपयोग करें।

3

मुझे लगता है कि एक "उल्का" तरीका यह है है:

सर्वर साइड पर बना सकते हैं और एक ClientSession संग्रह

UserSession = new Meteor.Collection("user_sessions"); 

Meteor.publish('user_sessions', function (user) { 

    return UserSession.find(user);  
}); 

ग्राहक पक्ष पर प्रकाशित

Session.set('user_id', 42); 

UserSession = new Meteor.Collection("user_sessions"); 
Meteor.subscribe('user_sessions', Session.get('user_id')); 

अब आप एक है एप्लिकेशन-स्तरीय UserSession ऑब्जेक्ट जो उस उपयोगकर्ता के लिए विशिष्ट है जिसे आप सामान डाल सकते हैं/प्राप्त कर सकते हैं।

इसके अलावा, आप मेटियर # विधियों का उपयोग कर सर्वर पर उपयोगकर्ता सत्र संग्रह में हेरफेर कर सकते हैं।

+0

जब उपयोगकर्ता मतदान के बिना डिस्कनेक्ट करता है तो आप कैसे ट्रैक करते हैं? – joshrtay

+0

आईडीके? जो मैंने दिखाया वह एक लगातार ग्राहक डेटा होगा (वास्तव में किसी भी अन्य उल्का संग्रह से अलग नहीं है। –

+0

@joshrtay ऐसा लगता है कि जब उपयोगकर्ता डिस्कनेक्ट करता है तो विश्वसनीय संकेत के लिए आपको कुछ प्रकार का मतदान करना होगा (मान लें कि आपका मतलब बंद हो जाता है खिड़की या किसी अन्य पृष्ठ पर नेविगेट करें)। http://stackoverflow.com/a/10274212/156060 –

6

यदि आप उल्का की औथ शाखा का उपयोग करने के इच्छुक हैं, तो मैंने कुछ अतिरिक्त टिप्पणियों के साथ यही किया है। मैं जोश के जवाब का प्रशंसक नहीं था क्योंकि मुझे ग्राहकों पर भरोसा नहीं है! वे झूठ बोलते हैं।

इस उदाहरण में, हम कहेंगे कि प्रत्येक उपयोगकर्ता के पास एक जादुई वस्तु है। और हम किसी भी जानकारी का उपयोग करने से इनकार करते हैं जो उपयोगकर्ता क्लाइंट साइड (यानी सत्र चर) में हेरफेर कर सकता है।

सर्वर पर:

//Create our database 
MagicalObjects = new Meteor.Collection("magicalObjects"); 

// Publish the magical object for the client 
Meteor.publish("get-the-magical-object", function() { 

//In the auth branch, server and client have access to this.userId 
//And there is also a collection of users server side 

var uid = this.userId(); 
//I make sure that when I make this connection, I've created a magical object 
//for each user. 

//Let's assume this adds a parameter to magical object for the userId 
//it's linked to (i.e. magObject.uid = ~user id~) 

//we grab our current user from the users database, and pass to our function 
checkUserHasMagicalItem(Meteor.users.findOne({_id: uid})); 

var self = this; 
console.log('Writing publish'); 
console.log('uid: ' + this.userId()); 

var magicalObject = MagicalObjects.findOne({uid: uid}); 

//Now, I want to know if the magical object is changed -- and update accordingly 
//with its changes -- you might not need this part 

//If you don't- then just uncomment these two lines, ignore the rest 
//self.set("magicObject", uid, {magicalobject: magicalObject}); 
//self.flush(); 

//Here, we're going to watch anything that happens to our magical object 
//that's tied to our user 
var handle = MagicalObjects.find({uid: uid}).observe({ 
    added: function(doc, idx) 
    {  
    //get the latest version of our object 
    magicalObject = MagicalObjects.findOne({uid: uid}); 
    console.log('added object'); 
    //now we set this server side 
    self.set("magicObject", uid, {magicalobject: magicalObject}); 
    self.flush(); 
    }, 
    //I'm not concerned about removing, but 
    //we do care if it is changed 
    changed: function(newDoc, idx, oldDoc) 
    { 
    console.log('changed object'); 
    magicalObject = MagicalObjects.findOne({uid: uid}); 
    self.set("magicObject", uid, {magicalobject: magicalObject}); 
    self.flush();   
    }  
//end observe 

}); 

//for when the player disconnects 
self.onStop(function() { 

    console.log('Stopping'); 
    handle.stop(); 

//end onStop 
}); 

//end publish 
}); 

क्लाइंट पर:

//this is the name of our collection client side 
MagicalObject = new Meteor.Collection("magicObject"); 

//notice the name is equal to whatever string you use when you call 
//self.set on the server 

//notice, this is the name equal to whatever string you use when you 
//call Meteor.publish on the server 
Meteor.subscribe("get-the-magical-object"); 

तब, जब तुम जाओ और अपने जादुई वस्तु हड़पने के लिए चाहते हैं:

var magicObject = MagicalObject.findOne().magicalobject; 

सूचना है कि यहाँ।magicalobject एक टाइपो नहीं है, यह पैरामीटर है जिसे हम self.set में उपयोग करते हैं - {magicalobject: magicalObject}।

मैं लंबे उत्तर के लिए क्षमा चाहता हूं। लेकिन जल्दी से लपेटने के लिए: हमने क्या किया है?

सर्वर पर, हमारे पास MagicalObjects का संग्रह है जिसे क्लाइंट तक पहुंच नहीं है। इसके बजाए, हम एक वस्तु को जादुई वस्तुओं से प्रकाशित करते हैं - जिसे हम "जादुई ऑब्जेक्ट" कहते हैं। हमने जो सेट अप किया है, उसके अनुसार, प्रत्येक ऑब्जेक्ट एक उपयोगकर्ता से संबंधित है। तो यह ऑप द्वारा अनुरोध किए गए उपयोगकर्ता विशिष्ट ऑब्जेक्ट है।

क्लाइंट एक संग्रह बनाता है (जिसका नाम "जादुई ऑब्जेक्ट" है), और सर्वर डेटाबेस में वास्तविक डेटा बदलते समय डेटा भेज दिया जाता है। इस संग्रह में केवल एक ऑब्जेक्ट डिज़ाइन है, लेकिन उस ऑब्जेक्ट में कई पैरामीटर हो सकते हैं (उदा। MagicalObject.kazoo या magicalObject.isHarryPotter) या आप कई अलग-अलग ऑब्जेक्ट्स (उदा। NonMagicItem) स्टोर कर सकते हैं।

0

एक सत्र संग्रह से थोड़ा अलग व्यवहार करता है। यदि आप वास्तव में सत्र आधारित समाधान की तलाश में हैं, तो सत्रों को सेट करने के लिए सत्र.सेट() विधि का उपयोग करें, और सत्र.get() के साथ आवश्यक होने पर उन्हें पुनर्प्राप्त करें।

8

user-session smart package मैंने मेटर के लिए बिल्कुल लिखा है इसके लिए डिज़ाइन किया गया है। यह उल्का Session एपीआई (setDefault के अपवाद के साथ), और कुछ अतिरिक्त लोगों के सभी तरीकों को भी प्रदान करता है। यह प्रतिक्रियाशील है, और सभी परिवर्तन लगातार हैं। सबसे अच्छा, यह ग्राहक पर और सर्वर पर अतिरिक्त userId तर्क के साथ उपलब्ध है।

+2

उत्कृष्ट पैकेज। यही है कि मौसम का सत्र डिफ़ॉल्ट रूप से होना चाहिए। मेरे द्वारा दायर की गई समस्या को संभालना भी आसान होगा। प्रकाशित करें। –

+1

यह है एक महान पैकेज। आपने 'userId' पर भरोसा क्यों चुना? क्या सिर्फ 'sessionId' पर भरोसा करना संभव नहीं है, जो लॉग इन किए बिना भी काम करेगा? मैंने अभी तक आपका कोड नहीं देखा है। मैं कुछ डाइनर लेता हूं और इन सब की बेहतर समझ प्राप्त करने के लिए इसे देखना शुरू कर देता हूं –

1

ध्यान देने योग्य एक बात यह है कि UserSession उस उपयोगकर्ता के लिए काम नहीं करता है जिसने क्लाइंट में लॉग इन नहीं किया है। मुझे इस परिदृश्य का सामना करना पड़ा, क्योंकि मैं मोंगोडीबी को बचाने से पहले संशोधित करने के लिए एक नए उपयोगकर्ता की डेटा ऑब्जेक्ट का निर्माण करना चाहता था। संशोधन वर्तमान पृष्ठ के यूआरएल पथ (आयरन रूट क्लाइंट साइड रूट का उपयोग करके) से प्राप्त एक विशेषता/फ़ील्ड जोड़ना था। लेकिन मुझे यह त्रुटि मिल रही थी,

"जब आप कोई उपयोगकर्ता लॉग इन नहीं करते हैं तो आप UserSession विधियों का उपयोग नहीं कर सकते हैं।"

इसलिए यदि आपका उपयोग केस लॉग इन उपयोगकर्ता के लिए क्लाइंट और सर्वर के बीच डेटा साझा करने के लिए प्रतिबंधित है, तो UserSession पैकेज नौकरी करने लगता है। पारदर्शी ग्राहक और सर्वर सत्र समन्वयन पर

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

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