Soru Komut satırı argümanlarını bir Node.js programına nasıl geçiririm?


Yazılı bir web sunucum var node.js ve belirli bir klasörle başlatmak istiyorum. JavaScript'teki argümanlara nasıl erişeceğimi bilmiyorum. Düğümü şu şekilde çalıştırıyorum:

$ node server.js folder

İşte server.js benim sunucu kodum. Node.js yardımı bunun mümkün olduğunu söylüyor:

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

JavaScript’teki bu argümanlara nasıl erişebilirim? Bir şekilde bu bilgiyi internette bulamamıştım.


1775
2017-12-04 01:56


Menşei




Cevaplar:


Standart Yöntem (kütüphane yok)

Argümanlar saklanır process.argv

Burada komut satırını ele geçirirken düğümdeki dokümanlar:

process.argv komut satırı argümanlarını içeren bir dizidir. İlk öğe 'düğüm', ikinci öğe ise JavaScript dosyasının adı olacaktır. Sonraki elemanlar herhangi bir ek komut satırı argümanı olacak.

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

Bu şunları üretecektir:

$ 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

2356
2017-12-04 02:05



Evet. Teşekkürler. console.log (process.argv [2]); klasörüm yazdırıyor - milkplus
Komut satırı argümanlarıyla bir node.js betiğini çalıştırmak için komut istemine ne yazmalıyım? - Anderson Green
GÜNCELLEME: Yukarıdaki sorunun cevabını buldum. stackoverflow.com/questions/12925802/... - Anderson Green
Minimist harika ve basit bir argüman ayrıştırıcısıdır - Guilherme Nagatomo
Konumunu bildiğinizde tek bir bağımsız değişkene de erişebilirsiniz: process.argv[n] nerede n sıfır tabanlı dizin - Luca Steeb


Düzenli bir javascript işlevi gibi argümanları normalleştirmek için bunu node.js kabuk komut dosyalarında yapıyorum:

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

İlk arg'in genellikle nodejs'e giden yol olduğunu ve ikinci argümanın yürütmekte olduğunuz komut dosyasının yeri olduğunu unutmayın.


479
2018-04-23 23:13



Teşekkürler Jaseem. Gelecekte yazılan yeri görmeyi çok isterim. Çok fazla js kütüphanesi kırılacaktı ... - Mauvis Ledford
Bu cevap benim için NodeJS belgelerinden doğrudan olan ilkinden daha yararlıdır. En azından aradığım şeyi başarmamı sağladı. - JohnAllen
Bu cevabı 4 yıl önce yazdığım bir not ve çalıştığım kod bugün hala% 100 iyi çalışıyor. Yine de, düğümün en son sürümleri ve hala sıfır sorunlarıyla güncel kalmak: Sadece basit bir kabuk komut dosyası. JS kütüphaneleriyle dolu büyük bir küresel nesnenin parçası değil. Bugün hala cevaplarımın arkasındayım. 4 yıl içinde başka bir güncelleme yapacağım. - Mauvis Ledford
var args = process.argv.splice(process.execArgv.length + 2); // çünkü düğüm komut kullanımının istisnaları vardır, örneğin: node --harmony script.js balala. görmek process.execArgv - cuixiping
@cuixiping ama execArgv Hangi değil içinde argv 2 tane yeter - Tommi Kyntola


Güncel sağ Bunun için kullanmak için cevap minimist kütüphane. Kullanırdık düğüm iyimser ama o zamandan beri kullanımdan kaldırıldı.

İşte, doğrudan doğruya minimist dokümantasyondan nasıl yararlanılacağına dair bir örnek:

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' }

239
2017-07-08 17:26



Aslında, bu çözüm daha fazla bayrak ve argüman ile komut satırı aracı geliştirmek için daha yararlıdır ve daha fazla IMHO yükseltilmelidir. - JK ABC
Imo, bu daha basit bir alternatif npmjs.com/package/command-line-args - klodoma
OP'nin sadece basit komut satırı bilgilerine erişmesini istediği için, bu en doğru cevabı ben istemem. Ancak, CLI'nızı genişletmeyi planlıyorsanız, hem minimist hem de komut satırı-armaları çok yararlı olduğunu kabul ediyorum. - Justus Romijn
'-N5' niçin 'n5: true' üretmediğini merak ediyorum - bu bana mantıklı geliyor. - Max Waterman
@MaxWaterman: çünkü tek bir tire ile başlayan seçenekler sadece tek bir karaktere aittir. Tek bir char seçeneği izleyen herhangi bir seçenek, seçenek için bir argüman olarak alınır (boşluk gerekmez). Seçeneği iki çizgi ile başlatmak (yani --n5) 'n5: true' üretmelidir. Bu, çoğu Unix komut satırı araçları için oldukça standart bir davranıştır (ama ne yazık ki hepsi değil). - Menno Smits


Şu andaki trendlere göre 2018 cevabı:


Vanilla javascript argümanı ayrıştırma:

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

Bu döndürür:

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

Resmi dokümanlar


Bağımsız değişken ayrıştırma için en çok kullanılan NPM paketleri:

Minimist: Minimum argüman ayrıştırma için.

Commander.js: Argüman ayrıştırma için en çok kabul gören modül.

miyav: Commander.js'ye daha açık alternatif

Yargs: Daha karmaşık argüman ayrıştırma (ağır).

Vorpal.js: Bağımsız değişken ayrıştırma ile olgun / etkileşimli komut satırı uygulamaları.


204
2018-01-14 05:26



Yargs çok iyi bir - ForzaGreen
"$ npm install -g yargs", 1.9 MB JavaScript kodu verdi. Bir argv ayrıştırıcı kütüphanesi iki megabayt kod gerektirdiğinde bu çılgınlık ne zaman bitecek? Artan saldırı yüzeyi, boşa RAM vb ... - joonas.fi
Yargs, komut satırı argümanlarını ayrıştıran daha büyük bir araçtır. Çılgınlık yok, sadece bilgi eksikliği. Daha hafif bir şey istiyorsanız, ham JS, Meow veya Minimist kullanın. - dthree
nconf eksik - Michael
"$ npm i yargs" -> 800 KB burada, paket sahipleri nihayet alakasız dosyaları görmezden gelmeyi öğrendim sanırım. Neyse, aptalca projeler için hala büyük, ama sağlamlığa ihtiyaç duyduğunuzda ve daha büyük projelerde bağımlılıklarınız var. - Andre Figueiredo


İyimser (düğüm-iyimser)

Çıkış yapmak iyimser kütüphaneKomut satırı seçeneklerini el ile ayrıştırmaktan çok daha iyi.

Güncelleştirme

Optimist kullanımdan kaldırılmıştır. Deneyin yargs Bu bir iyimser aktif çatalıdır.


108
2017-07-04 04:02



Bağlantı için +1. Komut satırı seçenek parsers uzun bir liste var github.com/joyent/node/wiki/modules#wiki-parsers-commandline - Thilo
Bu kullanımdan kaldırıldı. Yargs bir iyimser çatalıdır. github.com/chevex/yargs - Nikolay Yordanov
Minimist şimdi kabul edilmeyen iyimser için başka bir halef. Bu "tüm güzel dekorasyonlar olmadan iyimser argüman çözümleyicinin cesareti" dir. Son ayda 23 milyon indirme (12/2015 itibariyle). - aap


Burada birçok harika cevap var, ama hepsi çok karmaşık görünüyor. Bu, bash betiklerinin argüman değerlerine nasıl eriştiğine çok benzemektedir ve MooGoo'nun işaret ettiği gibi node.js ile standart olarak sunulmuştur. (Sadece node.js için yeni olan biri için anlaşılabilir hale getirmek için)

Örnek:

$ 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"

69
2017-12-12 05:19





Commander.js

Seçeneklerinizi, eylemlerinizi ve argümanlarınızı tanımlamak için harika çalışır. Ayrıca sizin için yardım sayfalarını oluşturur.

Derhal

Geri arama yaklaşımını beğenirseniz, kullanıcıdan giriş almak için harika çalışır.

Eş İstemi

Jeneratör yaklaşımını beğendiyseniz, kullanıcı girişi için harika çalışıyor.


66
2017-09-20 10:20



@Evan Carroll lütfen kullanmadığım bir kütüphaneyi tanıtmak için cevabımı düzenlemeyin stackoverflow.com/posts/7483600/revisions Özellikle, eksik olduğunuz bir özellik nedeniyle, bu fikirlerin başkalarının cevaplarına yönelik düzenlemeler değil, modül yazarlarına yorum veya çekme istekleri için kaydedilmesi gerekir. - balupton
Commander.js bana gerçekten yardımcı oldu. Diğer kitaplıklar, nexe derleyicisiyle çalışmayacaktı ama bu bir numara. Eğer nexe kullanırken args almak istiyorsanız, nexe derleyicisinden -f'ye geçtiğinizden emin olun. - pierce.jason
Commander.js Extreamelly kolay! - aemonge


Stdio Kütüphanesi

NodeJS'de komut satırı bağımsız değişkenlerini ayrıştırmanın en kolay yolu stdio modülü. UNIX'den ilham alındı getopt yarar, aşağıdaki gibi önemsiz:

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'}
});

Önceki kodu bu komutla çalıştırırsanız:

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

Sonra ops nesne aşağıdaki gibi olacaktır:

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

Böylece istediğin gibi kullanabilirsin. Örneğin:

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

Gruplanmış seçenekler de desteklenir, böylece yazabilirsiniz -om yerine -o -m.

Ayrıca, stdio otomatik olarak bir yardım / kullanım çıkışı üretebilir. Ararsan ops.printHelp() aşağıdakileri alırsınız:

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

Zorunlu bir seçenek verilmediyse (hata mesajından önce) veya yanlış belirtilmişse (örneğin, bir seçenek için tek bir arg seçerseniz ve 2'ye ihtiyaç duyarsa), önceki mesaj da gösterilir.

Yükleyebilirsiniz stdio modülü kullanarak NPM:

npm install stdio

36
2017-08-13 10:30



SO's TOS'a göre, sgmonda'nın modülün tek koruyucusu olduğunu belirtmekte fayda var;) Güzel küçük modül olsa da. Kesinlikle yararlı. - Qix
Gerçekten de, en son güncelleme 30 Aralık 2014 olmasına rağmen yararlıdır. Diğer paketler kadar iyi korunmayabilir. - fearless_fool
güzel lib! tks! son güncellemeleri witthout olmasına rağmen .. Yeterince iyi işlevselliği var - Pablo Ezequiel