在 Connect/Express 应用程序框架中使请求超时。
这是一个通过 npm 注册表 可用的 Node.js 模块。安装使用 npm install
命令
$ npm install connect-timeout
注意 除非您采取措施停止自己的中间件处理,否则不建议将此模块用作“顶级”中间件(即 app.use(timeout('5s'))
)。有关如何用作顶级中间件,请参见 作为顶级中间件。
当请求超过给定的超时时间时,库将发出“超时”事件,但节点将继续处理缓慢的请求,直到它终止。即使您在超时回调中返回 HTTP 响应,缓慢的请求也会继续使用 CPU 和内存。为了更好地控制 CPU/内存,您可能需要找到耗时较长的事件(第三方 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)