¿Hay alguna forma de detectar cuándo un cliente se desconecta de un servidor de meteoros, ya sea refrescándolo o navegando fuera de la página, para que el servidor pueda intentar una limpieza?Limpieza del servidor después de que un cliente se desconecta
Respuesta
Una técnica es implementar un método "keepalive" que cada cliente llama regularmente. Esto supone que tiene un user_id
en cada cliente 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);
si está utilizando autenticación tiene acceso al ID del usuario en el Método y Publicado funciones, se podría implementar su seguimiento no .. por ejemplo, podría establecer un "visto por última vez" habitación cuando el usuario cambia:
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});
});
creo que mejor forma de hacerlo es ponerse al zócalo evento de cierre en función de publicar.
Meteor.publish("your_collection", function() {
this.session.socket.on("close", function() { /*do your thing*/});
}
ACTUALIZACIÓN:
reciente versión de meteoritos utiliza _SESSION así:
this._session.socket.on("close", function() { /*do your thing*/});
Eso es genial. Pero luego aparentemente me encuentro con este problema: http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert-on-s – huyz
Gracias . Esta es la respuesta a mi pregunta: [Meteor observa ejecutarse para siempre] (http://stackoverflow.com/q/12902392/599991) – zVictor
Uso el meteorito 0.6.1 y para esta línea 'this.session.socket.on (" close ", function() {/ * haz lo tuyo * /});' mi servidor devuelve _TypeError: no se puede leer la propiedad 'socket' de undefined_ Pero cuando lo corrijo a 'this._session.socket.on (" close ", function() {/ * haz lo tuyo * /}); 'funciona genial, gracias – fantom
he implementado un paquete inteligente Meteor que rastrea todas las sesiones conectadas de diferentes sesiones y detecta tanto en la sesión de cierre de sesión y desconecta eventos, sin un mantenimiento caro.
para detectar eventos de desconexión/cierre de sesión, sólo puede hacer lo siguiente:
UserStatus.on "connectionLogout", (info) ->
console.log(info.userId + " with session " + info.connectionId + " logged out")
También se puede utilizar de forma reactiva. ¡Echale un vistazo!
EDIT:v0.3.0
de estado de usuario ahora también rastrea a los usuarios que están inactivos!
¿Se puede hacer esto por página y no a través de toda la aplicación? – Scalahansolo
Sí, aunque eso aún no está implementado. Abra una solicitud de función! –
Estoy usando Iron Router y llamo a mi código de limpieza en el evento unload
de mi controlador principal. Seguro que esto no va a coger el caso de un cierre de pestaña, pero todavía se siente lo suficientemente bueno para muchos casos de uso
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. psycopg2 se desconecta del servidor
- 2. Manejo de WinRT StreamSocket se desconecta (tanto del lado del servidor como del cliente)
- 3. WCF: cómo detectar el lado del cliente si el servidor me desconecta
- 4. El dispositivo Android se desconecta del depurador unos segundos después de que se tocó el punto de interrupción
- 5. Cómo detectar si WCF Streaming El cliente se desconecta de streaming medio
- 6. La conexión del cliente Arduino (Uno) Ethernet falla después de que muchas impresiones del cliente
- 7. Sincronización del estado del juego Cliente-Servidor
- 8. iPhone Socket TCP/IP del servidor/cliente
- 9. socket.io cliente que no recibe mensajes del servidor
- 10. ¿Cómo escribir un servidor retorcido que también es un cliente?
- 11. Limpieza después de todas las pruebas junit
- 12. ¿Cómo hacer una limpieza después de SIGKILL?
- 13. ¿Hay un cliente Websocket del lado del servidor para node.js?
- 14. ¿Cómo se determina el NOMBRE del lado del cliente de un control de servidor?
- 15. Método del lado del servidor y del lado del cliente
- 16. Obtener el nombre de usuario del cliente que se conectó al servidor web
- 17. Cómo finalizar un script PhantomJS solo después de que se han producido redirecciones del lado del cliente
- 18. ¿Impide que el cliente sobrecargue el servidor?
- 19. SenTestKit: ¿limpieza después de que se hayan ejecutado TODAS las pruebas?
- 20. RegisterOnSubmitStatement después de la validación del lado del cliente
- 21. Servidor Tomcat/Certificado SSL autofirmado del cliente
- 22. Ruby: del lado del cliente o del lado del servidor?
- 23. ¿Cómo detectar una desconexión del cliente utilizando un cliente/servidor de canalización con nombre?
- 24. Enviando la imagen del cliente al servidor
- 25. TCP: El servidor envía [RST, ACK] inmediatamente después de recibir [SYN] del cliente
- 26. Desarrollo del cliente para el servidor icecast
- 27. PHP :: Cómo se borra un archivo del servidor después de leerlo. Unlink() se ejecuta antes de
- 28. Web Charting, lado del servidor o del lado del cliente?
- 29. Invocar una función de cliente js en Meteor después de obtener resultados del servidor
- 30. Linux: Impedir que se detenga un proceso en segundo plano después de cerrar el cliente SSH
Después de mucho buscar, creo que esta es la mejor solución por el momento. ¡¡Gracias!! – greggreg
Esto es casi un pseudocódigo, ya que no está funcional como está: el primer setInterval no tiene un intervalo especificado. Además, el comando Connections.update no especifica la actualización {'user_id': user_id}. Puede haber otros errores. Sin embargo, es un buen comienzo. –
@debergalis ¿Sigue siendo esta la manera recomendada de ver si los clientes están muertos? – user2602152