暫停
1.9.0
Connect/Express 應用程式框架中的請求逾時。
這是一個可透過 npm 註冊表取得的 Node.js 模組。使用npm install
指令完成安裝:
$ npm install connect-timeout
注意不建議將此模組作為「頂級」中間件(即app.use(timeout('5s'))
),除非您採取預防措施來停止自己的中間件處理。有關如何用作頂級中間件的信息,請參閱頂級中間件。
當請求超過給定超時時,庫將發出「超時」事件,但節點將繼續處理緩慢的請求,直到終止。即使您在逾時回呼中傳回 HTTP 回應,緩慢的請求也將繼續使用 CPU 和記憶體。為了更好地控制 CPU/內存,您可能需要查找花費很長時間的事件(第 3 方 HTTP 請求、磁碟 I/O、資料庫呼叫)並找到取消它們的方法,和/或關閉附加的套接字。
傳回在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 )
麻省理工學院