Czy istnieje sposób na wykrycie, kiedy klient odłącza się od serwera meteorytów, odświeżając lub nawigując od strony, aby serwer mógł wykonać pewne czyszczenie?Oczyszczanie serwera po odłączeniu klienta
Odpowiedz
Jedną z technik jest wdrożenie "utrzymywanej" metody, którą regularnie wywołuje każdy klient. Zakłada się, że masz user_id
przechowywany w każdym klienta Session
.
// 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);
jeśli używasz uwierzytelniania masz dostęp do ID użytkownika w metodzie i Publish funkcje, można wdrożyć śledzenie tam .. np można ustawić „ostatni widział”, kiedy użytkownik przełącza pokój:
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});
});
myślę Lepszym sposobem jest zamknięcie gniazda złapać zdarzenie w funkcji publikowania.
Meteor.publish("your_collection", function() {
this.session.socket.on("close", function() { /*do your thing*/});
}
UPDATE:
Nowsza wersja meteoru wykorzystuje _SESSION tak:
this._session.socket.on("close", function() { /*do your thing*/});
To świetnie. Ale wtedy najwyraźniej natknąłem się na ten problem: http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert-on-s – huyz
Dzięki . Oto odpowiedź na moje pytanie: [Meteor obserwuj bieganie na zawsze] (http://stackoverflow.com/q/12902392/599991) – zVictor
Używam meteor 0.6.1 i dla tej linii 'this.session.socket.on (" close ", function() {/ * wykonaj twoją rzecz * /});' mój serwer zwraca _TypeError: Nie można odczytać właściwości 'socket' z undefined_ Ale kiedy poprawię to do 'this.session.socket.on (" close ", function() {/ * do rzeczy * /}); 'działa świetnie, dzięki – fantom
I zostały wdrożone smart pakiet Meteor, który śledzi wszystkie podłączone sesje z różnych sesji i wykrywa zarówno wylogowania sesji i rozłączaj zdarzenia, bez kosztownego keepalive.
celu wykrycia zdarzenia rozłączanie/wylogowania, można po prostu wykonaj następujące czynności:
UserStatus.on "connectionLogout", (info) ->
console.log(info.userId + " with session " + info.connectionId + " logged out")
Można również użyć go reaktywnie. Sprawdź to!
EDIT:v0.3.0
z obsługą stanu teraz śledzi użytkowników bezczynności, jak dobrze!
Czy można to zrobić na podstawie strony, a nie całej aplikacji? – Scalahansolo
Tak, chociaż nie zostało to jeszcze zaimplementowane. Otwórz żądanie funkcji! –
Używam Iron Router i wywołuję mój kod oczyszczania na unload
zdarzeń mojego głównego kontrolera. Na pewno nie będzie to miało wpływu na zamykanie karty, ale nadal jest wystarczająco dobre dla wielu przypadków użycia.
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!');
}
});
- 1. Odświeżanie iAd po odłączeniu sieci
- 2. Oczyszczanie Embera po opuszczeniu trasy
- 3. Oczyszczanie po wszystkich testach junitowych
- 4. Webpack: Ignoruj biblioteki klienta po stronie serwera
- 5. Pomiar czasu reakcji serwera (po stronie klienta)
- 6. Ponownie połącz klienta RMI po restarcie serwera
- 7. rozłącz klienta od strony serwera po stronie
- 8. Flas sse-stream nie zakończył się po odłączeniu firefoxa
- 9. MPMoviePlayerViewController zatrzymuje odtwarzanie po odłączeniu słuchawek
- 10. Wymuszanie uwierzytelniania Facebook: po stronie klienta i po stronie serwera
- 11. Kiedy korzystać po stronie klienta lub po stronie serwera?
- 12. Logika po stronie klienta LUB logika po stronie serwera?
- 13. Pytanie klienta/serwera Pythona
- 14. Jak mogę ponownie podłączyć gniazdo boost :: po odłączeniu?
- 15. Aplikacja klienta/serwera - utrata bajtów
- 16. Jak określić stronę NAZWA kontrolera serwera po stronie klienta?
- 17. Czy można zamknąć gniazda Java po stronie klienta i serwera?
- 18. Renderuj różne komponenty po stronie klienta i serwera.
- 19. Emberjs, strona serwera po stronie klienta, wszystko w?
- 20. Zabezpieczenia i uwierzytelnianie klienta-serwera
- 21. Utwórz aplikację java serwera klienta
- 22. Języki po stronie klienta
- 23. Tworzenie klienta dla serwera Icecast
- 24. Oczyszczanie zadań Kubernetes
- 25. Oczyszczanie buforów CSS
- 26. CSS po stronie serwera?
- 27. Biblioteka klienta/serwera Java RTSP
- 28. Terminologia dotycząca klienta a serwera
- 29. Uwierzytelnianie użytkowników G + po stronie serwera, po zalogowaniu po stronie klienta
- 30. Przekierowania po stronie serwera
Po wielu poszukiwaniach uważam, że jest to najlepsze rozwiązanie na razie. Dzięki!! – greggreg
Jest to prawie pseudokod, ponieważ nie jest funkcjonalne, tak jak jest: pierwsza setInterval nie ma podanego przedziału. Również komenda Connections.update nie określa aktualizacji {'identyfikator_użytkownika': identyfikator_użytkownika}. Mogą występować inne błędy. To dobry początek. –
@debergalis Czy to nadal jest zalecany sposób sprawdzenia, czy klienci są martwi? – user2602152