2012-11-24 7 views
10

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

मैंने कई तरीकों की कोशिश की है। पहले के रूप में इस सवाल का Server cleanup after a client disconnects, जो में hooking पता चलता है में उल्लिखित किया गया था:

this.session.socket.on("close") 

लेकिन जब मैंने किया था, और एक संग्रह बदलने की कोशिश की, फेंक दिया एक त्रुटि "उल्का कोड हमेशा एक फाइबर के भीतर चलाना चाहिए"। मुझे लगता है कि यह समस्या इसलिए है क्योंकि सॉकेट बंद होने के बाद, फाइबर मारे जाते हैं, और इसलिए डेटाबेस तक पहुंच असंभव है। ओपी ने "Meteor code must always run within a Fiber" when calling Collection.insert on server को एक संभावित समाधान के रूप में इंगित किया, लेकिन मुझे यकीन नहीं था कि उत्तर की टिप्पणियों के आधार पर यह सबसे अच्छा तरीका है या नहीं।

मैं तो चर पर autorun करने की कोशिश की:

Meteor.default_server.stream_server.all_sockets().length 

लेकिन ऑटोरन लग रहा था कभी नहीं कहा जाता था, इसलिए मुझे लगता है कि चर संभालने कर रहा हूँ एक प्रतिक्रियाशील संदर्भ नहीं है, और मुझे यकीन है कि कैसे करने के लिए नहीं था इसे एक बनाओ

अंतिम विचार एक रखरखाव शैली की बात करना था, लेकिन ऐसा लगता है कि उल्का दर्शन के अनाज के खिलाफ पूरी तरह से जाना जाता है, और मुझे लगता है कि मैं केवल एक पूर्ण अंतिम उपाय के रूप में उपयोग करूंगा।

मैंने पर कार्यों के console.log किया, और एकमात्र अन्य कार्य संभवतः .on("data") था, लेकिन यह सॉकेट बंद होने पर नहीं कहा जाता है।

मैं यहां कुछ नुकसान पहुंचा रहा हूं, इसलिए कोई मदद बहुत अच्छी होगी, धन्यवाद।

उत्तर

8

पूर्णता के लिए, ऊपर दिए गए दो उत्तरों को गठबंधन करना शायद सबसे अच्छा है। ,

  • ऑनलाइन स्थिति Meteor.users में, के रूप में एक अलग संग्रह करने का विरोध किया,, रखें के रूप में https://github.com/erundook/meteor-profile-online
  • कॉलबैक के माध्यम से डिस्कनेक्शन पर नज़र रखें में एक दिल की धड़कन के बजाय https://github.com/murilopolese/howmanypeoplearelooking
  • में के रूप में: दूसरे शब्दों में, निम्न कार्य करें

यह शायद उल्का में इसे लागू करने का कैननिक तरीका होगा। मैंने इसे एक स्मार्ट पैकेज के रूप में बनाया है जिसे आप मेटोराइट के साथ स्थापित कर सकते हैं: https://github.com/mizzao/meteor-user-status

+0

इस के लिए पर्याप्त धन्यवाद नहीं कर सकता :) – Pawan

+0

हालांकि यह बहुत अच्छा है, दस्तावेज़ विशेष रूप से कहते हैं कि यह एनन उपयोगकर्ताओं को ट्रैक नहीं करता है, इसलिए यह वास्तव में मूल प्रश्न का उत्तर नहीं देता है। – cazgp

+1

@cazgp चूंकि मैंने इस पोस्ट को लिखा है, मैंने अज्ञात उपयोगकर्ताओं को ट्रैक करने के लिए पैकेज को अद्यतन किया है। जाहिर है हम अज्ञात उपयोगकर्ताओं को 'Meteor.users' में ट्रैक नहीं कर सकते हैं, लेकिन उनके कनेक्शन सभी ट्रैक किए गए हैं। –

2

चेकआउट GitHub परियोजना howmanypeoplearelooking

उल्का आवेदन को दिखाने के लिए दिए जाने वाले उपयोगकर्ताओं अभी ऑनलाइन हैं परीक्षण।

+0

यह एक शरारत है। मैंने कोड डाउनलोड किया है ('Dumbs = new meteor.Collection (" dumbs ");' :)) – Matanya

+0

@Matanya: 'Dumbs' सिर्फ एक बचपन का संग्रह नाम है, लेकिन [ऐप काम करता है] (https: // github .com/murilopolese/howmanypeoplearelooking/खींच/2)। –

3

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

Meteor.publish("whatever", function() { 
    userId = this.userId; 
    if(userId) Stats.update({}, {$addToSet: {users: userId}}); 
    else Stats.update({}, {$inc: {users_anon: 1}}); 

    // This is required, because otherwise each time the publish function is called, 
    // the events re-bind and the counts will start becoming ridiculous as the functions 
    // are called multiple times! 
    if(this.session.socket._events.data.length === 1) { 

    this.session.socket.on("data", Meteor.bindEnvironment(function(data) { 
     var method = JSON.parse(data).method; 

     // If a user is logging in, dec anon. Don't need to add user to set, 
     // because when a user logs in, they are re-subscribed to the collection, 
     // so the publish function will be called again. 
     // Similarly, if they logout, they re-subscribe, and so the anon count 
     // will be handled when the publish function is called again - need only 
     // to take out the user ID from the users array. 
     if(method === 'login') 
     Stats.update({}, {$inc: {users_anon: -1}}); 

     // If a user is logging out, remove from set 
     else if(method === 'logout') 
     Stats.update({}, {$pull: {users: userId}}); 

    }, function(e) { 
     console.log(e); 
    })); 

    this.session.socket.on("close", Meteor.bindEnvironment(function() { 
     if(userId === null || userId === undefined) 
     Stats.update({}, {$inc: {users_anon: -1}}); 
     else 
     Stats.update({}, {$pull: {users: userId}}); 
    }, function(e) { 
     console.log("close error", e); 
    })); 
    } 
} 
संबंधित मुद्दे