nodejs node headers node.js connection request abort

node.js - headers - node js request on



Cómo verificar si la conexión fue abortada en el servidor node.js (5)

Estoy haciendo un sondeo largo con node.js.
Básicamente, el servidor node.js acepta la solicitud del usuario y luego busca algunas actualizaciones. Si no hay actualizaciones, las comprobará después del tiempo de espera.
Pero, ¿qué pasa si el usuario ha cerrado su pestaña o ha ido a otra página? En mi caso, el guión sigue funcionando.
¿Hay alguna forma en node.js para verificar o detectar o detectar un evento cuando el usuario ha cancelado su solicitud (cerró la conexión)?


¿Hay alguna forma en node.js para verificar o detectar o detectar un evento cuando el usuario ha cancelado su solicitud (cerró la conexión)?

Puede intentar utilizar el evento de cierre http.ServerRequest . Ejemplo simple:

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");


Estoy usando Express.js (~ 4.10.6) y el siguiente código funciona bien para mí:

//GET Request: app.get(''/'', function(req, res){ req.on(''close'', function(){ console.log(''Client closed the connection''); }); });

Tan pronto como 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.


Gracias a las respuestas de Miroshko y yojimbo87, pude ver el evento "cerrado", pero tuve que hacer algunos ajustes adicionales.

La razón por la que el simple hecho de detectar el evento ''cerrar'' no solucionó 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 envía algo a el cliente (por lo que he entendido, esto se debe al protocolo HTTP).
Entonces, el ajuste adicional fue escribir algo en la respuesta de vez en cuando.
Una cosa más que impedía que esto funcionara, es que tenía ''Tipo de contenido'' como ''aplicación / json''. Cambiarlo a ''texto / javascript'' ayudó a transmitir ''espacios en blanco'' de vez en cuando sin cerrar la conexión.
Al final, tuve 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 solo para mostrar las partes sensibles.

Me gustaría saber si hay mejores soluciones, pero esto está funcionando para mí en este momento.



req.on(''close'', function(err) { ... }); usar req.on(''close'', function(err) { ... }); en lugar de req.connection.on(''close'', function(err) { ... });

Hay una distinción muy importante. req.on () agrega un escucha a esta solicitud mientras que req.connection.on (), agrega un escucha a la conexión (keep-alive) entre el cliente y el servidor. Si usa req.connection.on (), cada vez que el cliente reutiliza una conexión, agrega un oyente más a la misma conexión. Cuando finalmente se interrumpe la conexión, se dispara a todos los oyentes.

El alcance de la función normalmente lo mantiene a salvo de esto arruinando 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 avisar al usuario de esto:

(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) ...