middleware de timeout
Hace expirar una solicitud en el framework de aplicaciones Connect/Express.
Instalar
Este es un módulo de Node.js disponible a través del
registro npm. La instalación se hace usando el
comando npm install:
npm install connect-timeoutyarn add connect-timeoutpnpm add connect-timeoutbun add connect-timeoutAPI
NOTA Este módulo no se recomienda como middleware de “nivel superior” (es decir,
app.use(timeout('5s'))) a menos que tomes precauciones para detener el procesamiento
de tu propio middleware. Ver como middleware de nivel superior
para cómo usarlo como middleware de nivel superior.
Aunque la librería emitirá un evento ‘timeout’ cuando las solicitudes excedan el tiempo límite dado, node continuará procesando la solicitud lenta hasta que termine. Las solicitudes lentas seguirán usando CPU y memoria, incluso si estás devolviendo una respuesta HTTP en el callback del timeout. Para un mejor control sobre CPU/memoria, puede que necesites encontrar los eventos que están tardando mucho (solicitudes HTTP de terceros, I/O de disco, llamadas a base de datos) y encontrar una forma de cancelarlos, y/o cerrar los sockets adjuntos.
timeout(time, [options])
Devuelve un middleware que expira en time milisegundos. time también puede
ser una cadena aceptada por el módulo ms.
Al expirar, req emitirá "timeout".
Opciones
La función timeout toma un objeto options opcional que puede contener
cualquiera de las siguientes claves:
respond
Controla si este módulo “responderá” en forma de reenviar un error.
Si es true, el error de timeout se pasa a next() para que puedas personalizar
el comportamiento de la respuesta. Este error tiene una propiedad .timeout así como
.status == 503. El valor predeterminado es true.
req.clearTimeout()
Borra el timeout de la solicitud. El timeout se elimina completamente y no se disparará para esta solicitud en el futuro.
req.timedout
true si el timeout se disparó; false en caso contrario.
Ejemplos
como middleware de nivel superior
Debido a la forma en que funciona el procesamiento del middleware, una vez que este módulo pasa la solicitud al siguiente middleware (lo cual tiene que hacer para que puedas trabajar), ya no puede detener el flujo, así que debes tener cuidado de verificar si la solicitud ha expirado antes de continuar actuando sobre la solicitud.
var bodyParser = require('body-parser');var cookieParser = require('cookie-parser');var express = require('express');var timeout = require('connect-timeout');
// example of using this top-level; note the use of haltOnTimedout// after every middleware; it will stop the request flow on a timeoutvar app = express();app.use(timeout('5s'));app.use(bodyParser());app.use(haltOnTimedout);app.use(cookieParser());app.use(haltOnTimedout);
// Add your routes here, etc.
function haltOnTimedout(req, res, next) { if (!req.timedout) next();}
app.listen(3000);express 3.x
var express = require('express');var bodyParser = require('body-parser');var timeout = require('connect-timeout');
var app = express();app.post('/save', timeout('5s'), bodyParser.json(), haltOnTimedout, function (req, res, next) { savePost(req.body, function (err, id) { if (err) return next(err); if (req.timedout) return; res.send('saved as id ' + id); });});
function haltOnTimedout(req, res, next) { if (!req.timedout) next();}
function savePost(post, cb) { setTimeout( function () { cb(null, (Math.random() * 40000) >>> 0); }, (Math.random() * 7000) >>> 0 );}
app.listen(3000);connect
var bodyParser = require('body-parser');var connect = require('connect');var timeout = require('connect-timeout');
var app = connect();app.use('/save', timeout('5s'), bodyParser.json(), haltOnTimedout, function (req, res, next) { savePost(req.body, function (err, id) { if (err) return next(err); if (req.timedout) return; res.send('saved as id ' + id); });});
function haltOnTimedout(req, res, next) { if (!req.timedout) next();}
function savePost(post, cb) { setTimeout( function () { cb(null, (Math.random() * 40000) >>> 0); }, (Math.random() * 7000) >>> 0 );}
app.listen(3000);