Estoy haciendo una larga encuesta con node.js.
Básicamente, el servidor node.js acepta la solicitud del usuario y luego verifica algunas actualizaciones. Si no hay actualizaciones, las comprobará después del tiempo de espera.
Pero, ¿qué sucede si el usuario ha cerrado su pestaña o ha ido a otra página? En mi caso, el script continúa funcionando.
¿Hay alguna manera en node.js de verificar o detectar o atrapar un evento cuando el usuario ha abortado su solicitud (cerró la conexión)?Cómo comprobar si la conexión se anuló en el servidor node.js
Respuesta
Gracias a y respuestas de yojimbo87 de Miroshko que fue capaz de capturar el evento 'cerca', pero tuvieron que hacer algunos ajustes adicionales.
La razón por la cual el evento capturar 'cerrar' no solucionaba mi problema, es que cuando el cliente envía la solicitud al servidor node.js, el servidor no puede obtener información si la conexión sigue abierta hasta que le devuelve algo al cliente (por lo que yo entiendo, esto se debe al protocolo HTTP).
Por lo tanto, el ajuste adicional era escribir algo a la respuesta de vez en cuando.
Una cosa más que impedía que esto funcionara, es que tenía 'Content-type' como 'application/json'. Cambiarlo a 'texto/javascript' ayudó a transmitir 'espacios en blanco' de vez en cuando sin cerrar la conexión.
Al final, he tenido algo como esto:
var server = http.createServer(function(req,res){
res.writeHead(200, {'Content-type': 'text/javascript'});
req.connection.on('close',function(){
// code to handle connection abort
});
/**
* Here goes some long polling handler
* that performs res.write(' '); from time to time
*/
// some another code...
});
server.listen(NODE_PORT, NODE_LISTEN_HOST);
Mi código original es mucho más grande, así que tuve que cortarlo mucho sólo para mostrar las partes sensibles.
Me gustaría saber si hay mejores soluciones, pero esto está funcionando para mí en este momento.
Parece que su pregunta es muy similar a éste:
NodeJS HTTP request connection's close event fired twice
tratar
request.connection.on('close', function() {
...
});
¿Hay una manera de Node.js para comprobar o detectar o para coger un evento cuando el usuario ha abortado su solicitud (cerró la conexión)?
Puede intentar usar http.ServerRequest close event. Un simple ejemplo:
var http = require("http"),
util = require("util");
var httpServer = http.createServer(function(req, res) {
util.log("new request...");
// notify me when client connection is lost
req.on("close", function(err) {
util.log("request closed...");
});
// wait with response for 15 seconds
setTimeout(function() {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write("response");
res.end();
util.log("response sent...");
}, 15000);
});
httpServer.listen(8080);
util.log("Running on 8080");
Es necesario utilizar req.on('close', function(err) { ... });
en lugar de req.connection.on('close', function(err) { ... });
Hay una distinción muy importante. req.on() agrega un oyente a esta solicitud mientras que req.connection.on(), agrega un oyente a la conexión (keep-alive) entre el cliente y el servidor. Si usa req.connection.on(), cada vez que el cliente vuelve a utilizar una conexión, agrega un oyente más a la misma conexión. Cuando finalmente se interrumpe la conexión, todos los oyentes son despedidos.
La definición del alcance de las funciones normalmente lo mantiene a salvo de este error de la lógica de su servidor, pero, sin embargo, es algo peligroso. Afortunadamente al menos NodeJS 0.10.26 es lo suficientemente inteligente como para advertir al usuario de este:
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace:
at Socket.EventEmitter.addListener (events.js:160:15)
at Socket.Readable.on (_stream_readable.js:689:33)
...
estoy usando Express.js (~ 4.10.6) y el siguiente código está trabajando muy bien para mí:
//GET Request:
app.get('/', function(req, res){
req.on('close', function(){
console.log('Client closed the connection');
});
});
Tan pronto cuando cierro la pestaña del navegador, el navegador cierra la conexión y la función de devolución de llamada se ejecuta como se esperaba.
- 1. ¿Cómo comprobar en node.js si la variable es objeto JSON?
- 2. ¿Cómo comprobar si la conexión de TcpClient está cerrada?
- 3. Cómo comprobar la conexión FTP?
- 4. Android: ¿Cómo comprobar si el servidor está disponible?
- 5. Node.js mongodb cerrar la conexión
- 6. ¿Cómo comprobar si una conexión MySQL está cerrada en Python?
- 7. Comprobar si un archivo existe en el servidor en ASP.NET
- 8. System.Net.WebException: la solicitud se anuló: la solicitud se canceló
- 9. HeidiSQL la conexión al servidor MySQL - Se perdió la conexión ... servidor en la lectura inicial
- 10. Eventos enviados por el servidor en Node.JS
- 11. ¿Cómo comprobar si JBoss se está ejecutando en el servidor Unix?
- 12. ¿Cómo cierro una conexión Servidor-Enviar Eventos en el Frasco?
- 13. Cómo comprobar si existe un archivo en un servidor externo
- 14. Comprobar si la tabla existe en C#
- 15. Cómo comprobar si el objeto se ha dispuesto en C#
- 16. Detectando el cierre de la conexión del cliente en node.js
- 17. Conexión a un servidor remoto de Microsoft SQL desde Node.js
- 18. Cómo comprobar si se colocan 3 dedos en la pantalla
- 19. node.js proceso generado se queda si se destruye el script
- 20. Comprobar si el proceso se está ejecutando
- 21. cómo comprobar la conexión de Internet en wp7?
- 22. Selenium 2: ¿Cómo comprobar que el servidor se está ejecutando y detener el servidor?
- 23. ¿Cómo comprobar si el socket está cerrado en Boost.Asio?
- 24. ¿Cómo comprobar si el programa se ejecuta desde una consola?
- 25. Cómo comprobar si el correo se ha enviado correctamente
- 26. Cómo comprobar si el elemento se está arrastrando actualmente
- 27. cómo comprobar si la tostada se ha descartado o no
- 28. en línea Servidor Node.js
- 29. Android: ¿cómo comprobar si se está tocando la pantalla?
- 30. Comprobar conexión de red androide
Esta página tiene más información sobre la detección de conexiones TCP cerradas en general: http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html –