اذهب إلى المحتوى
  • 0

مشكلة في استخدام الدالة process في node.js

Tamim Fahed

السؤال

أرغب بتنفيذ أوامر معينة مثل الطباعة عندما يحدث إنهاء أو إيقاف تشغيل لخادم الويب node.js، وقمت باستخدام الدالة process كالتالي:

process.on('exit', function (){
    console.log('the server will shut down..');
});

ولكن عندما أقوم بالضغط على crtl-c في لوحة المفاتيح لإيقاف الخادم، أو حتى عندما يحدث أي خطأ Exception يوقف عمله، لا تظهر هذه الرسالة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

السبب في ذلك أن الحدث exit هو حدث اﻹنهاء العادي أي من دون أخطاء ومن دون event loops ومن دون kill

من أجل التقاط جميع حالات اﻹغلاق بما فيها Ctrl + C وExceptions وغير ذلك نكتب الكود التالي:

// attach user callback to the process event emitter
// if no callback, it will still exit gracefully on Ctrl-C
callback = // some function;

// do app specific cleaning before exiting
process.on('exit', callback);

// catch ctrl+c event and exit normally
process.on('SIGINT', function () {
  console.log('Ctrl-C...');
  process.exit(2);
});

//catch uncaught exceptions, trace, then exit normally
process.on('uncaughtException', function(e) {
  console.log('Uncaught Exception...');
  console.log(e.stack);
  process.exit(99);
});

الكود السابق ينفذ تابع callback عند اﻹغلاق النظامي ويطبع Ctrl-C... ويغلق الـprocess عند الضغط على Ctrl+C وأخيراً في حال حدوث exception يطبع الـstacktrace ويغلق process، طبعاً أنت يمكنك إسناد نفس التابع لجميع اﻷحداث، المهم هو الفكرة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لايحدث استجابة عند نقر ctrl + c بسبب أن الحدث الخاص بها مختلف وليس exit بل هو SIGINT:

//catches ctrl+c event
process.on('SIGINT', exitHandler.bind(null, {exit:true}));

يمكن أيضا استخادم الأحداث التالية:

// catches "kill pid" قتل العملية
// nodemon restart
SIGUSR1
SIGUSR2


// حدوث استثناء
uncaughtException

يمكن اختصار جميع الحالات:

[`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`].forEach((eventType) => {
  process.on(eventType, cleanUpServer.bind(null, eventType));
})

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...