انقضاء مهلة الطلب في إطار عمل تطبيق Connect/Express.
هذه وحدة Node.js متاحة من خلال سجل npm. يتم التثبيت باستخدام أمر npm install
:
$ npm install connect-timeout
ملاحظة: لا يُنصح باستخدام هذه الوحدة باعتبارها برنامجًا وسيطًا "عالي المستوى" (على سبيل المثال، app.use(timeout('5s'))
) إلا إذا اتخذت الاحتياطات اللازمة لإيقاف معالجة البرامج الوسيطة الخاصة بك. راجع البرامج الوسيطة عالية المستوى لمعرفة كيفية استخدامها كبرامج وسيطة عالية المستوى.
بينما ستصدر المكتبة حدث "مهلة" عندما تتجاوز الطلبات المهلة المحددة، ستستمر العقدة في معالجة الطلب البطيء حتى تنتهي. ستستمر الطلبات البطيئة في استخدام وحدة المعالجة المركزية والذاكرة، حتى إذا كنت تقوم بإرجاع استجابة HTTP في رد اتصال المهلة. للتحكم بشكل أفضل في وحدة المعالجة المركزية/الذاكرة، قد تحتاج إلى العثور على الأحداث التي تستغرق وقتًا طويلاً (طلبات HTTP لجهة خارجية، وإدخال/إخراج القرص، واستدعاءات قاعدة البيانات) وإيجاد طريقة لإلغائها و/أو إغلاق المقابس المرفقة .
إرجاع البرامج الوسيطة التي تنتهي مهلتها 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 )
معهد ماساتشوستس للتكنولوجيا