Тайм-аут запроса в платформе приложений Connect/Express.
Это модуль Node.js, доступный через реестр npm. Установка осуществляется с помощью команды npm install
:
$ npm install connect-timeout
ПРИМЕЧАНИЕ. Этот модуль не рекомендуется использовать в качестве промежуточного программного обеспечения «верхнего уровня» (т. е. app.use(timeout('5s'))
), если вы не примете меры предосторожности, чтобы остановить обработку вашего собственного промежуточного программного обеспечения. См. промежуточное программное обеспечение верхнего уровня, чтобы узнать, как использовать его в качестве промежуточного программного обеспечения верхнего уровня.
Хотя библиотека генерирует событие «тайм-аут», когда запросы превышают заданный тайм-аут, узел будет продолжать обработку медленного запроса до тех пор, пока он не завершится. Медленные запросы будут продолжать использовать процессор и память, даже если вы возвращаете ответ HTTP в обратном вызове таймаута. Для лучшего контроля над процессором/памятью вам может потребоваться найти события, которые занимают много времени (сторонние HTTP-запросы, дисковый ввод-вывод, вызовы базы данных) и найти способ их отменить и/или закрыть подключенные сокеты. .
Возвращает промежуточное программное обеспечение, time
ожидания которого истекает в миллисекундах. time
также может быть строкой, принимаемой модулем ms. По тайм-ауту req
выдаст "timeout"
.
Функция timeout
принимает необязательный объект options
, который может содержать любой из следующих ключей:
Определяет, будет ли этот модуль «отвечать» в виде пересылки ошибки. Если true
, ошибка тайм-аута передается в next()
чтобы вы могли настроить поведение ответа. Эта ошибка имеет свойство .timeout
, а также .status == 503
. По умолчанию это значение true
.
Очищает тайм-аут запроса. Тайм-аут полностью удален и не будет срабатывать для этого запроса в будущем.
true
если тайм-аут сработал; false
в противном случае.
Из-за особенностей обработки промежуточного программного обеспечения, как только этот модуль передает запрос следующему промежуточному программному обеспечению (что он должен сделать, чтобы вы могли выполнять работу), он больше не может остановить поток, поэтому вы должны позаботиться о том, чтобы проверить, Время ожидания запроса истекло, прежде чем вы продолжите действовать по запросу.
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 )
Массачусетский технологический институт