it-swarm.asia

كيف يمكنني تمرير وسيطات سطر الأوامر إلى برنامج Node.js؟

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

$ node server.js folder

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

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

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

2126
milkplus

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

يتم تخزين الوسائط في process.argv

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

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

// 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
2753
MooGoo

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

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

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

581
Mauvis Ledford

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

فيما يلي مثال لكيفية استخدامها مأخوذة مباشرةً من الوثائق المصغرة:

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

-

$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }

-

$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
{ _: [ 'foo', 'bar', 'baz' ],
  x: 3,
  y: 4,
  n: 5,
  a: true,
  b: true,
  c: true,
  beep: 'boop' }
303
real_ate

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


حجة الفانيلا جافا سكريبت تحليل:

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

هذا يعود:

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

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


حزم NPM الأكثر استخدامًا لتحليل الوسيطة:

الحد الأدنى: للحد الأدنى من تحليل الوسيطة.

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

مواء: بديل أخف عن Commander.js

Yargs: تحليل وسيطة أكثر تطوراً (ثقيل).

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

267
dthree

المتفائل (العقدة المتفائل)

راجع مكتبة المتفائل ، هو أفضل بكثير من تحليل خيارات سطر الأوامر باليد.

تحديث

تم تجاهل التفاؤل. جرب خيوط وهو مفترق نشط من المتفائل.

115
gor

العديد من الإجابات الرائعة هنا ، ولكن يبدو الأمر معقدًا للغاية. يشبه هذا إلى حد كبير كيفية وصول البرامج النصية للباش إلى قيم وسيطات ويتم توفيرها بالفعل مع node.js كما أشار MooGoo. (فقط لجعلها مفهومة لشخص جديد على node.js)

مثال:

$ node yourscript.js banana monkey

var program_name = process.argv[0]; //value will be "node"
var script_path = process.argv[1]; //value will be "yourscript.js"
var first_value = process.argv[2]; //value will be "banana"
var second_value = process.argv[3]; //value will be "monkey"
84
Kalemanzi

Commander.js

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

على الفور

يعمل بشكل رائع للحصول على مدخلات من المستخدم ، إذا كنت تحب طريقة رد الاتصال.

شارك في موجه

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

72
balupton

مكتبة ستديو

أسهل طريقة لتحليل وسيطات سطر الأوامر في NodeJS تستخدم stdio الوحدة النمطية. مستوحاة من أداة UNIX getopt ، فهي تافهة كما يلي:

var stdio = require('stdio');
var ops = stdio.getopt({
    'check': {key: 'c', args: 2, description: 'What this option means'},
    'map': {key: 'm', description: 'Another description'},
    'kaka': {args: 1, mandatory: true},
    'ooo': {key: 'o'}
});

إذا قمت بتشغيل الكود السابق باستخدام هذا الأمر:

node <your_script.js> -c 23 45 --map -k 23 file1 file2

ثم ops الكائن سيكون كما يلي:

{ check: [ '23', '45' ],
  args: [ 'file1', 'file2' ],
  map: true,
  kaka: '23' }

حتى تتمكن من استخدامه كما تريد. على سبيل المثال:

if (ops.kaka && ops.check) {
    console.log(ops.kaka + ops.check[0]);
}

يتم أيضًا دعم الخيارات المجمعة ، بحيث يمكنك كتابة -om بدلاً من -o -m.

علاوة على ذلك ، stdio يمكنه إنشاء إخراج تعليمات/استخدام تلقائيًا. إذا اتصلت بـ ops.printHelp() ، فستحصل على ما يلي:

USAGE: node something.js [--check <ARG1> <ARG2>] [--kaka] [--ooo] [--map]
  -c, --check <ARG1> <ARG2>   What this option means (mandatory)
  -k, --kaka                  (mandatory)
  --map                       Another description
  -o, --ooo

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

يمكنك تثبيت stdio module باستخدام NPM :

npm install stdio
42
sgmonda

إذا كان اسم البرنامج النصي الخاص بك يسمى 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'
38
Sean H. Worthington

سطر أوامر args يستحق نظرة!

يمكنك تعيين خيارات باستخدام معايير التدوين الرئيسية ( معرفة المزيد ). هذه الأوامر جميعها متكافئة ، وتعيين نفس القيم:

$ example --verbose --timeout=1000 --src one.js --src two.js
$ example --verbose --timeout 1000 --src one.js two.js
$ example -vt 1000 --src one.js two.js
$ example -vt 1000 one.js two.js

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

const optionDefinitions = [
  { name: 'verbose', alias: 'v', type: Boolean },
  { name: 'src', type: String, multiple: true, defaultOption: true },
  { name: 'timeout', alias: 't', type: Number }
]

بعد ذلك ، قم بتحليل الخيارات باستخدام commandLineArgs () :

const commandLineArgs = require('command-line-args')
const options = commandLineArgs(optionDefinitions)

يبدو options الآن كما يلي:

{
  src: [
    'one.js',
    'two.js'
  ],
  verbose: true,
  timeout: 1000
}

الاستخدام المتقدم

بجانب الاستخدام المعتاد أعلاه ، يمكنك تكوين وسيطات سطر الأوامر لقبول نماذج بناء جملة أكثر تقدمًا.

بناء جملة يستند إلى الأوامر (أسلوب git) في النموذج:

$ executable <command> [options]

فمثلا.

$ git commit --squash -m "This is my commit message"

بناء جملة الأوامر والأوامر الفرعية (نمط عامل الميناء) في النموذج:

$ executable <command> [options] <sub-command> [options]

فمثلا.

$ docker run --detached --image centos bash -c yum install -y httpd

دليل استخدام جيل

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

مثال على دليل الاستخدام النموذجي.

usage

يعد دليل الاستخدام polymer-cli مثالًا جيدًا على الحياة الحقيقية.

usage

قراءة متعمقة

هناك الكثير لتتعلمه ، يرجى الاطلاع على الويكي للحصول على أمثلة ووثائق.

24
Lloyd

لا Libs مع الأعلام تنسيق في كائن بسيط

function getArgs () {
  const args = {}
  process.argv
    .slice(2, process.argv.length)
    .forEach( arg => {
      // long arg
      if (arg.slice(0,2) === '--') {
        const longArg = arg.split('=')
        args[longArg[0].slice(2,longArg[0].length)] = longArg[1]
      }
     // flags
      else if (arg[0] === '-') {
        const flags = arg.slice(1,arg.length).split('')
        flags.forEach(flag => {
          args[flag] = true
        })
      }
    })
  return args
}
const args = getArgs()
console.log(args)

أمثلة

بسيط

إدخال

node test.js -D --name=Hello

انتاج

{ D: true, name: 'Hello' }

العالم الحقيقي

إدخال

node config/build.js -lHRs --ip=$Host --port=$PORT --env=dev

انتاج

{ l: true,
  H: true,
  R: true,
  s: true,
  ip: '127.0.0.1',
  port: '8080',
  env: 'dev' }
22
Michael Warner

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

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' ]
21
Zlatko

فيما يلي حل 0 dep للوسائط المسماة:

const args = process.argv
    .slice(2)
    .map(arg => arg.split('='))
    .reduce((args, [value, key]) => {
        args[value] = key;
        return args;
    }, {});

console.log(args.foo)
console.log(args.fizz)

مثال:

$ node test.js foo=bar fizz=buzz
bar
buzz

ملاحظة: من الطبيعي أن يفشل هذا عندما تحتوي الوسيطة على =. هذا هو فقط للاستخدام بسيط جدا.

11
grebenyuksv

whibout librairies: using 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

لتحليل السيارات منطقية ورقم

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

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

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

10
250R

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

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

$ node args.js arg1 arg2

ملف: args.js

console.log(process.argv)

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

 ['node','args.js','arg1','arg2']
9
Piyush Sagar
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'
7
Abdennour TOUMI

يمكنك الوصول إلى وسيطات سطر الأوامر باستخدام system.args. وأستخدم الحل أدناه لتحليل الوسائط في كائن ، لذلك يمكنني الحصول على أي واحدة أريدها بالاسم.

var system = require('system');

var args = {};
system.args.map(function(x){return x.split("=")})
    .map(function(y){args[y[0]]=y[1]});

الآن لا تحتاج إلى معرفة فهرس الوسيطة. استخدمه مثل args.whatever

ملاحظة: يجب عليك استخدام الوسائط المسماة مثل file.js x=1 y=2 لاستخدام هذا الحل.

7
Evren Kutar

proj.js

for(var i=0;i<process.argv.length;i++){
  console.log(process.argv[i]);
}

طرفية:

nodemon app.js "arg1" "arg2" "arg3"

نتيجة:

0 'C:\\Program Files\\nodejs\\node.exe'
1 'C:\\Users\\Nouman\\Desktop\\Node\\camer nodejs\\proj.js'
2 'arg1' your first argument you passed.
3 'arg2' your second argument you passed.
4 'arg3' your third argument you passed.

التفسير:

0: دليل node.exe في maching الخاص بك (C:\Program Files\nodejs\node.exe ')

1: دليل ملف المشروع الخاص بك. (proj.js)

2: الوسيطة الأولى للعقدة (arg1)

3: الوسيطة الثانية للعقدة (arg2)

4: الوسيطة الثالثة للعقدة (arg3)

تبدأ الوسيطات الفعلية في نموذج 2nd فهرس argv ، أي process.argv[2].

6
Nouman Dilshad

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

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']);
6
Amadu Bah

بدون مكتبات

إذا كنت ترغب في القيام بذلك في Vanilla 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

ملاحظة يرجى تصحيح الكود في الخريطة وتقليل الوظيفة إذا وجدت حلًا أكثر أناقة ، شكرًا ؛)

4
Cassidy

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

العنصر الأول في صفيف process.argv سيكون دائمًا مسار نظام ملفات يشير إلى العقدة القابلة للتنفيذ. العنصر الثاني هو اسم ملف JavaScript الذي يتم تنفيذه. والعنصر الثالث هو الوسيطة الأولى التي تم تمريرها بالفعل من قبل المستخدم.

'use strict';

for (let j = 0; j < process.argv.length; j++) {  
    console.log(j + ' -> ' + (process.argv[j]));
}

كل ما يفعله هذا البرنامج النصي هو تنفيذ حلقة من خلال مجموعة process.argv وطباعة الفهارس ، إلى جانب العناصر المخزنة في هذه الفهارس. من المفيد جدًا تصحيح الأخطاء إذا قمت في أي وقت بالسؤال عن الوسائط التي تتلقاها ، وبأي ترتيب.

يمكنك أيضًا استخدام المكتبات مثل yargs للعمل مع وسيطات commnadline.

3
Rubin bhandari

على الرغم من أن الإجابات أعلاه مثالية ، وقد اقترح شخص ما بالفعل خيوط ، إلا أن استخدام الحزمة سهل للغاية. هذه حزمة لطيفة والتي تجعل من تمرير الحجج إلى سطر الأوامر أمرًا سهلاً حقًا.

npm i yargs
const yargs = require("yargs");
const argv = yargs.argv;
console.log(argv);

يرجى زيارة https://yargs.js.org/ لمزيد من المعلومات.

1
Akshay Rajput

يعد تمرير الحجج أمرًا سهلاً ، وتلقيها هو مجرد مسألة قراءة process.argv array Node التي يمكن الوصول إليها من كل مكان ، بشكل أساسي. لكن من المؤكد أنك تريد قراءتها كأزواج مفاتيح/قيمة ، لذلك ستحتاج إلى جزء نصي لتفسيره.

نشر Joseph Merdrignac طريقة جميلة باستخدام الإختزال ، ولكنه اعتمد على بناء جملة key=value بدلاً من -k value و --key value. لقد أعدت كتابة هذا المعيار الثاني بشكل أبشع وأطول ، وسأنشره كإجابة لأنه لن يتناسب مع التعليقات. لكنها تنجز المهمة.

   const args = process.argv.slice(2).reduce((acc,arg,cur,arr)=>{
     if(arg.match(/^--/)){
       acc[arg.substring(2)] = true
       acc['_lastkey'] = arg.substring(2)
     } else
     if(arg.match(/^-[^-]/)){
       for(key of arg.substring(1).split('')){
         acc[key] = true
         acc['_lastkey'] = key
       }
     } else
       if(acc['_lastkey']){
         acc[acc['_lastkey']] = arg
         delete acc['_lastkey']
       } else
         acc[arg] = true
     if(cur==arr.length-1)
       delete acc['_lastkey']
     return acc
   },{})

باستخدام هذا الرمز ، يمنحك أمر node script.js alpha beta -charlie delta --echo foxtrot الكائن التالي


args = {
 "alpha":true,
 "beta":true,
 "c":true,
 "h":true,
 "a":true,
 "r":true
 "l":true,
 "i":true,
 "e":"delta",
 "echo":"foxtrot"
}
1
isacvale

أعطى معظم الناس إجابات جيدة. أود أيضًا أن أساهم بشيء هنا. أقوم بتقديم الإجابة باستخدام مكتبة lodash للتكرار من خلال جميع وسيطات سطر الأوامر التي نمررها أثناء بدء التطبيق:

// Lodash library
const _ = require('lodash');

// Function that goes through each CommandLine Arguments and prints it to the console.
const runApp = () => {
    _.map(process.argv, (arg) => {
        console.log(arg);
    });
};

// Calling the function.
runApp();

لتشغيل التعليمات البرمجية أعلاه فقط قم بتشغيل الأوامر التالية:

npm install
node index.js xyz abc 123 456

ستكون النتيجة:

xyz 
abc 
123
456
0
S.Mishra

أفضل طريقة لتمرير وسيطات سطر الأوامر إلى برنامج Node.js باستخدام واجهة سطر الأوامر (CLI)

هناك وحدة npm أنيقة تسمى nodejs-cli التي يمكنك استخدامها.

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

0
madhur acharya

كما هو مذكور في مستندات العقدة تقوم خاصية 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
0
Adeojo Emmanuel IMM

process.argv هو صديقك ، يتم دعم وسيطات سطر الأوامر الأصلية في Node JS. انظر المثال أدناه ::

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