Expiration d'une requête dans l'infrastructure d'application Connect/Express.
Il s'agit d'un module Node.js disponible via le registre npm. L'installation se fait à l'aide de la commande npm install
:
$ npm install connect-timeout
REMARQUE Ce module n'est pas recommandé en tant que middleware « de premier niveau » (c'est-à-dire app.use(timeout('5s'))
) à moins que vous ne preniez des précautions pour arrêter le traitement de votre propre middleware. Voir en tant que middleware de premier niveau pour savoir comment l'utiliser en tant que middleware de premier niveau.
Alors que la bibliothèque émettra un événement « timeout » lorsque les requêtes dépassent le délai d'attente donné, le nœud continuera à traiter la requête lente jusqu'à ce qu'elle se termine. Les requêtes lentes continueront à utiliser le processeur et la mémoire, même si vous renvoyez une réponse HTTP lors du rappel du délai d'expiration. Pour un meilleur contrôle du processeur/de la mémoire, vous devrez peut-être rechercher les événements qui prennent beaucoup de temps (requêtes HTTP tierces, E/S disque, appels de base de données) et trouver un moyen de les annuler et/ou de fermer les sockets connectés. .
Renvoie un middleware qui expire en time
. time
peut également être une chaîne acceptée par le module ms. En cas d'expiration, req
émettra "timeout"
.
La fonction timeout
prend un objet options
facultatif qui peut contenir l'une des clés suivantes :
Contrôle si ce module « répondra » sous la forme de transfert d'une erreur. Si true
, l'erreur de délai d'attente est transmise à next()
afin que vous puissiez personnaliser le comportement de la réponse. Cette erreur a une propriété .timeout
ainsi que .status == 503
. La valeur par défaut est true
.
Efface le délai d'attente de la demande. Le délai d'attente est complètement supprimé et ne se déclenchera plus pour cette demande à l'avenir.
true
si le délai d'attente est déclenché ; false
sinon.
En raison de la façon dont fonctionne le traitement du middleware, une fois que ce module transmet la requête au middleware suivant (ce qu'il doit faire pour que vous puissiez travailler), il ne peut plus arrêter le flux, vous devez donc veiller à vérifier si le la demande a expiré avant que vous puissiez continuer à y donner suite.
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 )
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 )
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 )
MIT