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:

Ventana de terminal
npm install connect-timeout

API

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 timeout
var 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);

Licencia

MIT