javascript - كيف يمكنني تمرير وسيطات سطر الأوامر إلى برنامج nodejs؟




node.js arguments (15)

2018 الإجابة بناء على الاتجاهات الحالية في البرية:

تحليل حجة الفانيلا javascript:

const args = process.argv;
console.log(args);

هذا يعود:

$ node server.js one two=three four
['node', '/home/dthree/server.js', 'one', 'two=three', 'four']

المستندات الرسمية

معظم حزم NPM المستخدمة لتحليل الوسيطة:

الحد الأدنى: للحد الأدنى من تحليل الحجة.

Commander.js : الوحدة النمطية الأكثر استخدامًا لتحليل الوسيطة.

Meow : بديل أخف إلى Commander.js

Yargs : تحليل أكثر تعقيدًا (ثقيل).

Vorpal.js : تطبيقات سطر الأوامر الناضجة / التفاعلية مع تحليل الوسيطة.

لديّ خادم ويب مكتوب في Node.js وأود أن أبدأ باستخدام مجلد معين. لست متأكدًا من كيفية الوصول إلى الوسائط في JavaScript. أنا أشغل عقدة مثل هذا:

$ node server.js folder

هنا server.js هو رمز الخادم الخاص بي. مساعدة Node.js تقول أن هذا ممكن:

$ node -h
Usage: node [options] script.js [arguments]

كيف يمكنني الوصول إلى تلك الحجج في JavaScript؟ بطريقة ما لم أتمكن من العثور على هذه المعلومات على شبكة الإنترنت.


الطريقة القياسية (لا توجد مكتبة)

يتم تخزين الحجج في process.argv

في ما يلي مستندات العقد في سطر أوامر معالجة الخادم:

process.argv هو مصفوفة تحتوي على وسائط سطر الأوامر. سيكون العنصر الأول هو "العقدة" ، وسيكون العنصر الثاني هو اسم ملف جافا سكريبت. ستكون العناصر التالية أي حجج سطر أوامر إضافية.

// print process.argv
process.argv.forEach(function (val, index, array) {
  console.log(index + ': ' + val);
});

سيؤدي هذا إلى:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four

بدون المكتبات

إذا كنت ترغب في القيام بذلك في الفانيلا JS / ES6 يمكنك استخدام الحل التالي

عملت فقط في NodeJS> 6

const args = process.argv
  .slice(2)
  .map((val, i)=>{
    let object = {};
    let [regexForProp, regexForVal] = (() => [new RegExp('^(.+?)='), new RegExp('\=(.*)')] )();
    let [prop, value] = (() => [regexForProp.exec(val), regexForVal.exec(val)] )();
    if(!prop){
      object[val] = true;
      return object;
    } else {
      object[prop[1]] = value[1] ;
      return object
    }
  })
  .reduce((obj, item) => {
    let prop = Object.keys(item)[0];
    obj[prop] = item[prop];
    return obj;
  }, {});

وهذا الأمر

node index.js host=http://google.com port=8080 production

سوف تنتج النتيجة التالية

console.log(args);//{ host:'http://google.com',port:'8080',production:true }
console.log(args.host);//http://google.com
console.log(args.port);//8080
console.log(args.production);//true

ps الرجاء تصحيح الكود في الخريطة وتقليل الوظيفة إذا وجدت حل أكثر أناقة ، وذلك بفضل ؛)


دون الخصومات: استخدام Array.prototype.reduce ()

const args = process.argv.slice(2).reduce((acc, arg) => {

    let [k, v = true] = arg.split('=')
    acc[k] = v
    return acc

}, {})

لهذا node index.js count=2 print debug=false msg=hi

console.log(args) // { count: '2', print: true, debug: 'false', msg: 'hi' }

أيضا،

يمكننا ان نغير

    let [k, v = true] = arg.split('=')
    acc[k] = v

بواسطة (أطول)

    let [k, v] = arg.split('=')
    acc[k] = v === undefined ? true : /true|false/.test(v) ? v === 'true' : /[\d|\.]+/.test(v) ? Number(v) : v

لتحليل السيارات Boolean & Number

console.log(args) // { count: 2, print: true, debug: false, msg: 'hi' }

Commander.js

يعمل بشكل رائع لتحديد الخيارات والإجراءات والحجج. كما يولد صفحات المساعدة بالنسبة لك.

Promptly

يعمل بشكل جيد للحصول على مدخلات من المستخدم ، إذا كنت ترغب في نهج رد الاتصال.

Co-Prompt

يعمل بشكل جيد للحصول على مدخلات من المستخدم ، إذا كنت ترغب في نهج المولد.


إذا كان البرنامج النصي الخاص بك يسمى myScript.js وتريد تمرير الاسم الأول واسم العائلة ، "Sean Worthington" ، كحجج مثل أدناه:

node myScript.js Sean Worthington

ثم في النص البرمجي الخاص بك تكتب:

var firstName = process.argv[2]; // Will be set to 'Sean'
var lastName = process.argv[3]; // Will be set to 'Worthington'

تعتبر عملية تمرير وتحليل وجهات النظر عملية سهلة. توفر لك العقدة خاصية process.argv ، وهي عبارة عن مصفوفة من السلاسل ، وهي الوسيطات التي تم استخدامها عندما تم استدعاء العقدة. الإدخال الأول من الصفيف هو Node القابل للتنفيذ ، والمدخل الثاني هو اسم البرنامج النصي الخاص بك.

إذا قمت بتشغيل البرنامج النصي مع atguments أدناه

$ node args.js arg1 arg2

الملف: args.js

console.log(process.argv)

سوف تحصل على مجموعة مثل

 ['node','args.js','arg1','arg2']

ربما تكون فكرة جيدة لإدارة التكوين الخاص بك بطريقة مركزية باستخدام شيء مثل nconf https://github.com/flatiron/nconf

يساعدك على العمل مع ملفات التكوين ، متغيرات البيئة ، وسيطات سطر الأوامر.


كما هو مذكور في عقدة المستندات تقوم خاصية process.argv بإرجاع صفيف يحتوي على وسائط سطر الأوامر التي تم تمريرها عند بدء تشغيل عملية Node.js.

على سبيل المثال ، بافتراض البرنامج النصي التالي لـ process-args.js:

// print process.argv
process.argv.forEach((val, index) => {
   console.log(`${index}: ${val}`);
});

إطلاق عملية Node.js على النحو التالي:

 $ node process-args.js one two=three four

سوف تولد الإخراج:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four

لتتطابق الوسيطات مثل وظيفة جافا سكريبت العادية ، سأقوم بذلك في نصوص shell node.js:

var args = process.argv.slice(2);

لاحظ أن ال arg الأول هو عادة المسار إلى nodejs ، وأن ال arg الثاني هو موقع البرنامج النصي الذي تقوم بتنفيذه.


مقتطف بسيط إن وجد يحتاج إليه:

var fs = require('fs'), objMod = {};

process.argv.slice(2).map(function(y, i) {
  y = y.split('=');
  if (y[0] && y[1]) objMod[y[0]] = y[1];
  else console.log('Error in argument number ' + (i+1));
});

يمكنك أيضا استخدام حزمة yargs أنها ستجعل الشيء أسهل بكثير! هنا تذهب :) Yargs


يمكنك تحليل كل الحجج والتحقق من وجودها.

file: parse-cli-arguments.js:

module.exports = function(requiredArguments){
    var arguments = {};

    for (var index = 0; index < process.argv.length; index++) {
        var re = new RegExp('--([A-Za-z0-9_]+)=([A/-Za-z0-9_]+)'),
            matches = re.exec(process.argv[index]);

        if(matches !== null) {
            arguments[matches[1]] = matches[2];
        }
    }

    for (var index = 0; index < requiredArguments.length; index++) {
        if (arguments[requiredArguments[index]] === undefined) {
            throw(requiredArguments[index] + ' not defined. Please add the argument with --' + requiredArguments[index]);
        }
    }

    return arguments;
}

من مجرد القيام:

var arguments = require('./parse-cli-arguments')(['foo', 'bar', 'xpto']);

يوجد تطبيق لهذا. حسنا ، الوحدة. حسنا ، أكثر من واحد ، وربما المئات.

Yargs هي واحدة من المرح ، Yargs باردة للقراءة.

إليك مثال من صفحة github / npm:

#!/usr/bin/env node
var argv = require('yargs').argv;
console.log('(%d,%d)', argv.x, argv.y);
console.log(argv._);

الإخراج هنا (يقرأ الخيارات مع شرطات إلخ ، قصيرة وطويلة ، رقمية إلخ).

$ ./nonopt.js -x 6.82 -y 3.35 rum
(6.82,3.35)
[ 'rum' ] 
$ ./nonopt.js "me hearties" -x 0.54 yo -y 1.12 ho
(0.54,1.12)
[ 'me hearties', 'yo', 'ho' ]

npm install ps-grab

إذا كنت تريد تشغيل شيء كهذا:

node greeting.js --user Abdennour --website http://abdennoor.com 

-

var grab=require('ps-grab');
grab('--username') // return 'Abdennour'
grab('--action') // return 'http://abdennoor.com'

أو شيء من هذا القبيل:

node vbox.js -OS redhat -VM template-12332 ;

-

var grab=require('ps-grab');
grab('-OS') // return 'redhat'
grab('-VM') // return 'template-12332'






command-line-arguments