node.js - node - npm connect-timeout
Tiempo de respuesta de Express.js (4)
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 misma.
Si una solicitud lleva mucho tiempo, se debe agotar el tiempo de espera. Obviamente, esto no debería ocurrir, 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 ejemplo perfecto de esto.
app.get(''/sessions/'', function(req, res, callback){});
FIJAR
app.use(app,router);
siguiente antes de la app.use(app,router);
y parecía agregar 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 configurado el tiempo de espera en 2 minutos.
Antes de configurar sus rutas, agregue el código:
app.all(''*'', function(req, res, next) {
setTimeout(function() {
next();
}, 120000); // 120 seconds
});
Una actualización si uno está utilizando Express 4.2 y luego se eliminó el middleware de tiempo de espera, por lo que es necesario agregarlo manualmente con
npm install connect-timeout
y en el código tiene que ser (Editado como por comentario, cómo incluirlo en el código)
var timeout = require(''connect-timeout'');
app.use(timeout(''100s''));
Ya existe una compatibilidad con Connect Middleware for Timeout:
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 utilizar el middleware Timeout como un middleware de nivel superior como el anterior, el middleware haltOnTimedOut
debe ser el último middleware definido en la pila y se utiliza para capturar el evento timeout. Gracias @Aichholzer por la actualización.
Nota al costado:
Tenga en cuenta que si transfiere su propio middleware de tiempo de espera, los códigos de estado 4xx son para los errores del cliente y 5xx son para los 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 PUEDE repetir la solicitud sin modificaciones en cualquier momento posterior.
request.setTimeout(< time in milliseconds >)
hace el trabajo
https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback