Connect/Express アプリケーションフレームワークでリクエストをタイムアウトさせます。
これは、Node.js モジュールで、npm レジストリから入手できます。インストールは、npm install
コマンドを使用して行います。
$ npm install connect-timeout
注意 このモジュールは、「トップレベル」ミドルウェア(つまり、app.use(timeout('5s'))
)としては推奨されません。独自のミドルウェア処理を停止するための予防措置を講じない限り推奨されません。「トップレベルミドルウェアとして」を参照して、トップレベルミドルウェアとして使用する方法を確認してください。
ライブラリは、リクエストが指定されたタイムアウトを超えた場合に「timeout」イベントを発行しますが、nodeは遅いリクエストが終了するまで処理を継続します。タイムアウトコールバックで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)