2012-04-21 14 views
20

क्या कोई क्लाइंट किसी उल्का सर्वर से डिस्कनेक्ट करता है, या तो पृष्ठ से दूर ताज़ा या नेविगेट करके पता लगाने का कोई तरीका है, ताकि सर्वर कुछ क्लीनअप का प्रयास कर सके?क्लाइंट डिस्कनेक्ट होने के बाद सर्वर क्लीनअप

उत्तर

18

एक तकनीक "रखरखाव" विधि को लागू करने के लिए है जो प्रत्येक ग्राहक नियमित रूप से कॉल करता है। यह मानता है कि आपको प्रत्येक ग्राहक के Session में user_id मिला है।

// server code: heartbeat method 
Meteor.methods({ 
    keepalive: function (user_id) { 
    if (!Connections.findOne(user_id)) 
     Connections.insert({user_id: user_id}); 

    Connections.update(user_id, {$set: {last_seen: (new Date()).getTime()}}); 
    } 
}); 

// server code: clean up dead clients after 60 seconds 
Meteor.setInterval(function() { 
    var now = (new Date()).getTime(); 
    Connections.find({last_seen: {$lt: (now - 60 * 1000)}}).forEach(function (user) { 
    // do something here for each idle user 
    }); 
}); 

// client code: ping heartbeat every 5 seconds 
Meteor.setInterval(function() { 
    Meteor.call('keepalive', Session.get('user_id')); 
}, 5000); 
+0

बहुत खोज के बाद मुझे लगता है कि यह अब के लिए सबसे अच्छा समाधान है। धन्यवाद!! – greggreg

+6

यह लगभग छद्म कोड है, क्योंकि इसमें यह कार्यात्मक नहीं है: पहला सेट अंतराल में कोई अंतराल निर्दिष्ट नहीं है। इसके अलावा Connections.update कमांड {'user_id': user_id} को अद्यतन करने के लिए निर्दिष्ट नहीं है। अन्य त्रुटियां हो सकती हैं। हालांकि यह एक अच्छी शुरुआत है। –

+3

@debergalis क्या यह अभी भी यह देखने का अनुशंसित तरीका है कि ग्राहक मर चुके हैं या नहीं? – user2602152

1

आप प्रमाणीकरण आप विधि में उपयोगकर्ता की आईडी का उपयोग किया और कार्यों प्रकाशित उपयोग कर रहे हैं, तो आप अपने ट्रैकिंग लागू कर सकता है .. जैसे

Meteor.publish("messages", function(roomId) { 
    // assuming ActiveConnections is where you're tracking user connection activity 
    ActiveConnections.update({ userId: this.userId() }, { 
     $set:{ lastSeen: new Date().getTime() } 
    }); 
    return Messages.find({ roomId: roomId}); 
}); 
13

मुझे लगता है कि बेहतर तरीके से सॉकेट पास घटना को पकड़ने के लिए समारोह प्रकाशित है: यदि आप एक "पिछली बार" जब उपयोगकर्ता स्विच रूम सेट कर सकते हैं।

Meteor.publish("your_collection", function() { 
    this.session.socket.on("close", function() { /*do your thing*/}); 
} 

अद्यतन:

this._session.socket.on("close", function() { /*do your thing*/}); 
+0

यह बढ़िया है। लेकिन फिर मैं स्पष्ट रूप से इस समस्या में भाग लेता हूं: http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert-on-s – huyz

+0

धन्यवाद । यह मेरे प्रश्न का उत्तर है: [उल्का हमेशा के लिए चल रहा है] (http://stackoverflow.com/q/12902392/599991) – zVictor

+3

मैं उल्का 0.6.1 का उपयोग करता हूं और इस पंक्ति के लिए 'this.session.socket.on (" बंद करें ", फ़ंक्शन() {/ * अपनी बात करें * /}); 'मेरा सर्वर _Type त्रुटि देता है: अपरिभाषित_ की संपत्ति' सॉकेट 'नहीं पढ़ सकता है लेकिन जब मैं इसे' this._session.socket.on ("बंद करें" पर सही करता हूं, फ़ंक्शन() {/ * अपनी बात करें * /}); 'यह बहुत अच्छा काम करता है, धन्यवाद – fantom

2

मैं एक उल्का स्मार्ट पैकेज है कि विभिन्न सत्रों के सभी कनेक्ट किए गए सत्र ट्रैक और दोनों सत्र लॉगआउट का पता लगाता है क्रियान्वित किया है:

उल्का के

नया संस्करण _SESSION इस तरह का उपयोग करता है और महंगे रखरखाव के बिना घटनाओं को डिस्कनेक्ट करें।

https://github.com/mizzao/meteor-user-status

डिस्कनेक्ट/लॉगआउट घटनाओं का पता लगाने के लिए, आप केवल निम्न कर सकते हैं:

UserStatus.on "connectionLogout", (info) -> 
    console.log(info.userId + " with session " + info.connectionId + " logged out") 

आप भी इसे प्रतिक्रिया के रूप में उपयोग कर सकते हैं। इसकी जांच - पड़ताल करें!

संपादित करें:v0.3.0 उपयोगकर्ता-स्थिति की स्थिति अब उपयोगकर्ताओं को निष्क्रिय भी ट्रैक करता है!

+0

क्या यह प्रति पृष्ठ आधार पर किया जा सकता है और पूरे ऐप के माध्यम से नहीं? – Scalahansolo

+0

हां, हालांकि यह अभी तक लागू नहीं किया गया है। एक सुविधा अनुरोध खोलें! –

-1

मैं Iron Router का उपयोग कर रहा हूं और अपने मुख्य नियंत्रक के unload ईवेंट पर अपना क्लीनअप कोड कॉल कर रहा हूं। निश्चित रूप से यह एक टैब बंद होने की घटना को पकड़ नहीं पाएगा, लेकिन अभी भी कई उपयोग मामलों के लिए पर्याप्त अच्छा लगता है

ApplicationController = RouteController.extend({ 
    layoutTemplate: 'root', 
    data: {}, 
    fastRender: true, 
    onBeforeAction: function() { 
     this.next(); 
    }, 
    unload: function() { 
     if(Meteor.userId()) 
      Meteor.call('CleanUpTheUsersTrash'); 
    }, 
    action: function() { 
     console.log('this should be overridden by our actual controllers!'); 
    } 
}); 
संबंधित मुद्दे