注意

此页面由 timeout README 生成。

connect-timeout

NPM Version NPM Downloads Build Status Test Coverage

在 Connect/Express 应用程序框架中使请求超时。

安装

这是一个通过 npm 注册表提供的 Node.js 模块。安装通过 npm install 命令完成。

$ npm install connect-timeout

API

注意 不建议将此模块用作“顶级”中间件(例如 app.use(timeout('5s'))),除非您采取预防措施来停止自己的中间件处理。有关如何将其用作顶级中间件的更多信息,请参阅作为顶级中间件

尽管当请求超出给定超时时,该库将发出“timeout”事件,但 Node.js 将继续处理缓慢的请求直到其终止。即使您在超时回调中返回 HTTP 响应,缓慢的请求也将继续占用 CPU 和内存。为了更好地控制 CPU/内存,您可能需要找出耗时较长的事件(第三方 HTTP 请求、磁盘 I/O、数据库调用),并找到取消它们和/或关闭相关套接字的方法。

timeout(time, [options])

返回在 time 毫秒后超时的中间件。time 也可以是 ms 模块接受的字符串。超时时,req 将发出 "timeout" 事件。

选项

timeout 函数接受一个可选的 options 对象,该对象可能包含以下任何键

respond

控制此模块是否以转发错误的形式“响应”。如果为 true,则超时错误会传递给 next(),以便您可以自定义响应行为。此错误具有 .timeout 属性以及 .status == 503。此项默认为 true

req.clearTimeout()

清除请求上的超时。此超时将被完全移除,并且将来不会为此请求触发。

req.timedout

如果超时已触发则为 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)

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)

许可证

MIT