黑人生命也是命。
支持平等正義倡議.

connect-timeout

NPM Version NPM Downloads Build Status Test Coverage Gratipay

在 Connect/Express 應用程式架構中對要求進行逾時處理。

安裝

這是一個 Node.js 模組,可透過 npm 登錄 使用。安裝是使用 npm install 指令 進行的

$ npm install connect-timeout

API

注意 此模組不建議作為「頂層」中間件(即 app.use(timeout('5s'))),除非您採取預防措施來停止自己的中間件處理。請參閱 作為頂層中間件,瞭解如何使用頂層中間件。

雖然此函式庫會在要求超過指定逾時時發出「逾時」事件,但節點會繼續處理緩慢的請求,直到它終止。即使您在逾時回呼中傳回 HTTP 回應,緩慢的請求仍會繼續使用 CPU 和記憶體。若要更好地控制 CPU/記憶體,您可能需要找出花費很長時間的事件(第三方 HTTP 請求、磁碟 I/O、資料庫呼叫),並找到取消它們和/或關閉附加 socket 的方法。

timeout(time, [options])

傳回在 time 毫秒內逾時的 middleware。time 也可以是 ms 模組接受的字串。逾時時,req 會發出 "timeout"

選項

timeout 函式會取得一個選用的 options 物件,其中可能包含下列任何鍵

回應

控制此模組是否會以轉發錯誤的形式「回應」。如果為 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