Express.Tiempo de Espera de Respuesta js


PROBLEMA

He estado buscando tiempos de espera de solicitud/respuesta para Express.js pero todo parece estar relacionado con la conexión en lugar de la solicitud/respuesta en sí.

Si una solicitud está tardando mucho tiempo, se debe agotar el tiempo. Obviamente esto no debería suceder, pero incluso un simple error como tener un controlador de ruta sin una llamada a la devolución de llamada o sin res.send(), el navegador seguirá esperando una respuesta para siempre.

Un controlador de ruta vacío es un perfecto ejemplo de esto.

app.get('/sessions/', function(req, res, callback){});

FIX

He añadido lo siguiente antes app.use(app,router); y parecía añadir la funcionalidad de tiempo de espera. ¿Alguien tiene alguna experiencia/opinión sobre esto?

app.use(function(req, res, next){
    res.setTimeout(120000, function(){
        console.log('Request has timed out.');
            res.send(408);
        });

    next();
});

Tenga en cuenta que he establecido el tiempo de espera a 2 minutos.

Author: Xerri, 2014-02-11

4 answers

Ya hay un Middleware Connect para el soporte de tiempo de espera:

var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4

app.use(timeout(120000));
app.use(haltOnTimedout);

function haltOnTimedout(req, res, next){
  if (!req.timedout) next();
}

Si planea usar el middleware de tiempo de espera como un middleware de nivel superior como el anterior, el middleware haltOnTimedOut debe ser el último middleware definido en la pila y se usa para capturar el evento de tiempo de espera. Gracias @Aichholzer por la actualización.

Nota al margen:

Tenga en cuenta que si lanza su propio middleware de tiempo de espera, los códigos de estado 4xx son para errores del cliente y 5xx son para errores del servidor. 408s están reservados para cuando:

El cliente no produjo una solicitud dentro del tiempo que el servidor estaba preparado para esperar. El cliente PODRÁ repetir la solicitud sin modificaciones en cualquier momento posterior.

 60
Author: srquinn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 20:04:39

Una actualización si uno está usando Express 4.2, entonces el middleware de tiempo de espera se ha eliminado, por lo que debe agregarlo manualmente con

npm install connect-timeout

Y en el código tiene que ser (Editado según comentario, cómo incluirlo en el código)

 var timeout = require('connect-timeout');
 app.use(timeout('100s'));
 24
Author: V31,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-11 09:50:53

request.setTimeout(< time in milliseconds >) hace el trabajo

Https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback

 1
Author: rahul shukla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 09:06:51

Antes de establecer sus rutas, agregue el código:

app.all('*', function(req, res, next) {
    setTimeout(function() {
        next();
    }, 120000); // 120 seconds
});
 -5
Author: destino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-28 13:26:11