كيفية الخروج في Node.js




(13)

REPL (سطر الأوامر)

  • اضغط على ctrl + c مرتين

  • اكتب .exit واضغط على enter

ملف البرنامج النصي

process.exit(code)

عادةً ما يتم إنهاء العقدة بالرمز 0 عند عدم وجود عمليات التزامن قيد الانتظار.

يجب استخدام process.exit(1) للخروج برمز فشل. سيسمح لنا هذا باستنتاج أن العقدة لم تغلق بأمان وتم إجبارها على الإغلاق.

هناك رموز خروج أخرى مثل

3 - خطأ تحليل جافا سكريبت الداخلي (نادر جدًا جدًا)

5 - خطأ فادح في محرك جافا سكريبت v8

9 - حجة غير صالحة

للحصول على القائمة الكاملة ، راجع رموز خروج العقدة

ما هو الأمر المستخدم للخروج؟ (أي إنهاء عملية node.js)


من سطر الأوامر ، .exit هو ما تريده:

$ node
> .exit
$

تم توثيقه في مستندات REPL . REPL (Read-Eval-Print-Loop) هو ما يسمى سطر أوامر عقدة.

من برنامج عادي ، استخدم process.exit([code]) .


يعتمد ذلك على سبب رغبتك في الخروج من عملية node.js ، ولكن في أي حالة من الحالات ، يكون .exit process.exit() هو الخيار الأخير الذي يجب أخذه في الاعتبار . اقتباس من الوثائق:

من المهم ملاحظة أن استدعاء process.exit() سيجبر العملية على الخروج بأسرع وقت ممكن حتى إذا كانت هناك عمليات غير متزامنة معلقة لم تكتمل بعد ، بما في ذلك عمليات الإدخال / الإخراج إلى process.stdout و process.stderr .

في معظم الحالات ، ليس من الضروري في الواقع استدعاء process.exit() بشكل صريح. ستخرج عملية Node.js من تلقاء نفسها إذا لم يكن هناك عمل إضافي معلق في حلقة الحدث. يمكن تعيين الخاصية process.exitCode لإخبار العملية التي إنهاء التعليمات البرمجية لاستخدامها عند إنهاء العملية بأمان.

دعونا نغطي الأسباب المحتملة لعلك قد تكون على استعداد للخروج من عملية node.js ولماذا يجب عليك تجنب process.exit() :

الحالة 1 - اكتمل التنفيذ (نص سطر الأوامر)

إذا كان البرنامج النصي قد وصل إلى نهايته ولم يخرج مترجم العقدة ، فإنه يشير إلى أن بعض عمليات التزامن لا تزال معلقة. من الخطأ فرض إنهاء العملية باستخدام process.exit() في هذه المرحلة. من الأفضل محاولة فهم ما يحمل النص من الخروج بالطريقة المتوقعة . وعندما تقوم بتسوية هذا ، يمكنك استخدام process.exitCode لإرجاع أي نتيجة لعملية الاستدعاء.

الحالة 2 - الإنهاء بسبب الإشارة الخارجية (SIGINT / SIGTERM / أخرى)

على سبيل المثال ، إذا كنت على استعداد لإغلاق تطبيق صريح بأمان. على عكس نص سطر الأوامر ، يستمر تشغيل التطبيق السريع بشكل لا نهائي ، في انتظار طلبات جديدة. process.exit() خيارًا سيئًا هنا لأنه سيقطع جميع الطلبات التي هي في خط أنابيب. وبعضهم قد يكون غير عديم الفائدة (UPDATE ، DELETE). لن يعرف العميل مطلقًا ما إذا كانت هذه الطلبات قد اكتملت أم لا على جانب الخادم وقد يكون سبب عدم تناسق البيانات بين العميل والخادم. الحل الجيد الوحيد هو إخبار ملقم http بالتوقف عن قبول الطلبات الجديدة وانتظر حتى تنتهي المعلقة مع server.close() :

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

إذا لم يتم الخروج بعد - راجع الحالة 1.

الحالة 3 - خطأ داخلي

من الأفضل دائمًا throw خطأ ، ستحصل على تتبع مكدس ورسالة خطأ منسقة بشكل جيد. يمكن أن تحدد المستويات العليا من التعليمات البرمجية دائمًا ما إذا كان يمكنها التعامل مع الخطأ ( catch ) أو تركه يؤدي إلى تعطل العملية. على الجانب الآخر ، سيؤدي process.exit(1) إلى إنهاء العملية في صمت ولن تكون هناك فرصة للتعافي من هذا. قد تكون "الفائدة" الوحيدة من process.exit() ، يمكنك التأكد من إنهاء هذه العملية.


مجرد ملاحظة أن استخدام process.exit([number]) exit .

السبب في حدوث مشكلة ذلك لأن الكتابة إلى process.stdout في Node.js غير حظر وقد تحدث عبر علامات التجزئة متعددة من حلقة الحدث Node.js. استدعاء عملية process.exit () ، ومع ذلك ، يفرض عملية للخروج قبل أن يمكن تنفيذ هذه الكتابة الإضافية إلى stdout.

بدلاً من استدعاء process.exit () مباشرة ، يجب أن تقوم الشفرة بتعيين process.exitCode والسماح لهذه العملية بالخروج بشكل طبيعي من خلال تجنب جدولة أي عمل إضافي لحلقة الحدث:

إذا كان يمكنك تعيين رمز الإنهاء والسماح للعقدة الخروج بأمان:

process.exitCode = 1;

سطر الأوامر

اضغط على CTRL + C مرتين

أو

اكتب .exit واضغط على enter

ملف البرنامج النصي

process.exit(code)

إذا كنت في محطة يونكس أو سطر أوامر Windows وترغب في الخروج من عقدة REPL ، فإما أن ...

  • اضغط على Ctrl + C مرتين ، أو
  • اكتب .exit واضغط على Enter ، أو
  • اضغط Ctrl + D في بداية السطر (Unix فقط)

من وثائق nodejs.org الرسمية:

process.exit(code)

انهاء العملية مع الكود المحدد. إذا تم حذفه ، فإن الخروج يستخدم رمز "النجاح" 0.

للخروج برمز "فشل":

process.exit(1);

للخروج

let exitCode = 1;
process.exit(exitCode)

رموز الخروج مفيدة

1 - Catchall for general errors
2 - Misuse of shell builtins (according to Bash documentation)
126 - Command invoked cannot execute
127 - “command not found”
128 - Invalid argument to exit
128+n - Fatal error signal “n”
130 - Script terminated by Control-C
255\* - Exit status out of range

لدي تطبيق أردت أن:

  1. إرسال بريد إلكتروني إلى المستخدم
  2. الخروج برمز خطأ

واضطررت إلى ربط process.exit(code) exit حدث exit ، وإلا فلن يتم إرسال البريد نظرًا لأن استدعاء process.exit(code) يقتل الأحداث غير المتزامنة مباشرة.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

إذا كنت ترغب في الخروج من تطبيق العقدة شبيبة الكتابة

process.exit(1)

في شفرتك


وكما أوضحDominic ، فإن exit غير exit هو ممارسة أفضل بدلاً من استدعاء process.exit ([code]) :
process.exitCode = 1; throw new Error("my module xx condition failed");


تمكنت من الحصول على جميع عمليات العقدة للموت مباشرة من Git Bash shell على Windows 10 عن طريق كتابة taskkill -F -IM node.exe - وينتهي كل عمليات العقدة على جهاز الكمبيوتر الخاص بي في الحال. لقد وجدت أنه يمكنني أيضًا استخدام taskkill //F //IM node.exe . لست متأكدا لماذا كلا - و // العمل في هذا السياق. أتمنى أن يساعدك هذا!


لقد تم الإجابة على هذا بالفعل ولكني أردت إضافة بعض التوضيحات ...

يمكنك استخدام كل من exports و module.exports لاستيراد التعليمات البرمجية إلى التطبيق الخاص بك مثل هذا:

var mycode = require('./path/to/mycode');

حالة الاستخدام الأساسية التي ستراها (على سبيل المثال ، في كود المثال ExpressJS) هي أنك تقوم بتعيين الخصائص على كائن exports في ملف .js الذي تقوم باستيراده باستخدام require()

لذلك في مثال حساب بسيط ، يمكن أن يكون لديك:

(counter.js):

var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

... ثم في التطبيق الخاص بك (web.js ، أو في الحقيقة أي ملف .js آخر):

var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

بعبارات بسيطة ، يمكنك التفكير في الملفات المطلوبة كدوال تقوم بإرجاع كائن واحد ، ويمكنك إضافة خصائص (سلاسل ، أرقام ، صفائف ، وظائف ، أي شيء) إلى الكائن الذي يتم إرجاعه عن طريق تعيينها على exports .

في بعض الأحيان ستحتاج إلى الكائن الذي تم إرجاعه من استدعاء require() لتكون دالة يمكنك الاتصال بها ، بدلاً من مجرد كائن به خصائص. في هذه الحالة ، يجب أيضًا تعيين module.exports ، كما يلي:

(sayhello.js):

module.exports = exports = function() {
    console.log("Hello World!");
};

(app.js):

var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

يتم شرح الفرق بين الصادرات و module.exports بشكل أفضل في هذه الإجابة هنا .







node.js