process.argv, Node.js programını başlatan komut satırını tutan bir dizidir. 0. indeks node çalıştırılabilir dosyasının yolu, 1. indeks script'inin yoludur ve senin argümanların 2. indeksten başlar. Yani process.argv.slice(2) sana kullanıcının dosya adından sonra yazdığını tam olarak verir, her zaman string olarak.
İlk iki eleman tam yol olduğu için program yalnızca son kısımlarını (node ve index.js), ardından [ 'Ada', '42', '--verbose' ] yazdırıyor. Argümanlar satırını Grace 7 yap ve tekrar çalıştır: dizi de değişir.
process.argv içine neler girer
Shell, node'dan sonraki satırı boşluklardan böler ve parçaları Node.js'e verir. Dosya adından önce yazılan flag'ler senin programına değil, Node.js'in kendisine aittir:
node --max-old-space-size=4096 index.js --port=8080
# process.argv.slice(2) is [ '--port=8080' ]
# process.execArgv is [ '--max-old-space-size=4096' ]
Tırnaklar kelimeleri tek bir argümanda toplar ("Ada Lovelace" tek bir string olarak gelir), shell de *.txt gibi kalıpları Node.js görmeden önce dosya adlarına açar.
Argümanları slice(2) ile almak
Çoğu script beklediği argümanları destructure eder ve her birine bir varsayılan değer verir:
Program Hello, Ada yazdırdı: tek argüman name'i doldurdu, greeting ise varsayılan değerine düştü. Argümanlar satırında Ada'dan sonra Hi ekle, Hi, Ada yazdırır; satırı temizlersen Hello, world alırsın.
Sayılar string olarak gelir
Shell'in tipleri yoktur. Her argüman bir string'dir, bu yüzden onlarla yapılan aritmetik sen çevirene kadar yanlış çıkar:
a + b string'leri birleştirip 75 yaptı, Number() ise 12 verdi. Sayı olmayan bir kelime NaN olur; bu yüzden Number.isNaN ile kontrol et ve bozuk bir değerle devam etmek yerine bir kullanım mesajı yazdır.
--name=value flag'lerini elle ayrıştırmak
Birkaç flag için kısa bir döngü yeterlidir. Bu döngü --port=8080'i port: '8080''e, tek başına --verbose'u true'ya çevirir ve geri kalan her şeyi pozisyonel argüman olarak tutar:
Program {"port":"8080","verbose":true} ve [ 'build', 'src' ] yazdırdı; port hâlâ bir string. Bu döngü -p gibi kısa flag'leri ya da değeri bir sonraki argümanda olan flag'leri (--port 8080) işlemez; bunlar için aşağıdaki yerleşik parser'ı kullan.
Yerleşik parser: util.parseArgs
Node.js 18.3 ve sonrası util.parseArgs ile gelir; uzun ve kısa flag'leri, bir sonraki argümandaki değerleri, boolean'ları ve varsayılan değerleri işler:
const { parseArgs } = require('node:util');
// node index.js -p 8080 --verbose src
const { values, positionals } = parseArgs({
options: {
port: { type: 'string', short: 'p', default: '3000' },
verbose: { type: 'boolean', short: 'v' },
},
allowPositionals: true,
});
console.log(values); // [Object: null prototype] { port: '8080', verbose: true }
console.log(positionals); // [ 'src' ]
parseArgs varsayılan olarak process.argv.slice(2)'yi okur. Tanımlamadığın bir seçenekte hata fırlatır, bu da --prot gibi yazım hatalarını yakalar; bilinmeyen flag'leri kabul etmek için strict: false geçir. Seçenek tipleri yalnızca string ve boolean'dır, yani sayılar için yine Number() gerekir. values prototipi olmayan bir nesnedir, [Object: null prototype] ile yazdırılmasının nedeni budur; onu herhangi bir nesne gibi okursun.
Sık yapılan hatalar
process.argv[0]'ı ilk argüman sanmak. O, node'un yoludur. İlk argümanın process.argv[2]'dir.
Her şeyin string olduğunu unutmak. '10' > '9' ifadesi false'tur, çünkü string'ler harf harf karşılaştırılır. Önce çevir.
Gizli bilgileri argümanlara koymak. Komut satırları shell geçmişinde ve makinedeki diğer kullanıcıların okuyabildiği süreç listelerinde görünür. Parolaları ve API anahtarlarını bunun yerine ortam değişkenleriyle geçir.
Sıkça Sorulan Sorular
Bir npm script'ine nasıl argüman geçirilir?
Onları -- işaretinden sonra yaz: npm run start -- --port=4000. npm, --'dan sonraki her şeyi script'ine geçirir ve bunlar process.argv.slice(2) içinde görünür.
process.argv[2] neden undefined?
Çünkü program o argüman olmadan başlatıldı. Ona bir varsayılan değer ver (process.argv[2] ?? 'guest') ya da bir kullanım satırı yazdırıp process.exit(1) ile dur.
process.argv yerine yargs ya da commander mı kullanmalıyım?
Birkaç flag'i olan bir script için util.parseArgs yerleşik olarak gelir ve yeterlidir. commander ve yargs gibi paketler yardım metni, alt komutlar ve doğrulama ekler; aracında birden fazla komut olduğunda bunlar işe yarar.