process.argv adalah array yang berisi command line yang menjalankan program Node.js-mu. Index 0 adalah path ke executable node, index 1 adalah path ke script-mu, dan argumen milikmu dimulai dari index 2. Jadi process.argv.slice(2) memberimu tepat apa yang diketik user setelah nama file, selalu dalam bentuk string.
Dua entri pertama adalah path lengkap, jadi program ini hanya mencetak bagian terakhirnya (node dan index.js), lalu [ 'Ada', '42', '--verbose' ]. Ubah baris argumen menjadi Grace 7 lalu jalankan lagi: array-nya ikut berubah.
Apa saja yang masuk ke process.argv
Shell memecah baris setelah node berdasarkan spasi dan menyerahkan potongan-potongannya ke Node.js. Flag yang ditulis sebelum nama file adalah milik Node.js sendiri, bukan milik programmu:
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' ]
Tanda kutip menggabungkan beberapa kata menjadi satu argumen ("Ada Lovelace" tiba sebagai satu string), dan shell mengembangkan pola seperti *.txt menjadi nama-nama file sebelum Node.js melihatnya.
Mengambil argumen dengan slice(2)
Kebanyakan script men-destructure argumen yang diharapkan dan memberi masing-masing nilai default:
Hasilnya Hello, Ada: satu argumen mengisi name, dan greeting kembali ke nilai default-nya. Tambahkan Hi setelah Ada di baris argumen dan hasilnya Hi, Ada; kosongkan barisnya dan kamu mendapat Hello, world.
Angka tiba sebagai string
Shell tidak punya tipe. Setiap argumen adalah string, jadi aritmetika padanya salah sampai kamu mengubahnya:
a + b menggabungkan string-nya menjadi 75, dan Number() memberi 12. Kata yang bukan angka menjadi NaN, jadi cek dengan Number.isNaN dan cetak pesan petunjuk pemakaian alih-alih melanjutkan dengan nilai yang rusak.
Parse flag --name=value secara manual
Untuk beberapa flag, perulangan pendek sudah cukup. Perulangan ini mengubah --port=8080 menjadi port: '8080', --verbose tanpa nilai menjadi true, dan menyimpan sisanya sebagai argumen posisi:
Hasilnya {"port":"8080","verbose":true} dan [ 'build', 'src' ], dengan port tetap berupa string. Perulangan ini tidak menangani flag pendek seperti -p atau nilai di argumen berikutnya (--port 8080); untuk itu, pakai parser bawaan di bawah.
util.parseArgs, parser bawaan
Node.js 18.3 ke atas menyertakan util.parseArgs, yang menangani flag panjang dan pendek, nilai di argumen berikutnya, boolean, dan nilai default:
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 membaca process.argv.slice(2) secara default. Fungsi ini melempar error pada opsi yang tidak kamu deklarasikan, sehingga salah ketik seperti --prot ketahuan; berikan strict: false untuk menerima flag yang tidak dikenal. Tipe opsinya hanya string dan boolean, jadi angka tetap butuh Number(). values adalah object tanpa prototype, itulah sebabnya ia tercetak dengan [Object: null prototype]; baca saja seperti object biasa.
Kesalahan umum
Membaca process.argv[0] sebagai argumen pertama. Itu adalah path ke node. Argumen pertamamu adalah process.argv[2].
Lupa bahwa semuanya string. '10' > '9' bernilai false, karena string dibandingkan huruf demi huruf. Ubah dulu.
Menaruh rahasia di argumen. Command line muncul di riwayat shell dan di daftar proses yang bisa dibaca user lain di mesin yang sama. Berikan password dan API key lewat environment variable.
Pertanyaan yang sering diajukan
Bagaimana cara memberikan argumen ke npm script?
Taruh setelah --: npm run start -- --port=4000. npm meneruskan semua yang ada setelah -- ke script-mu, dan argumen itu muncul di process.argv.slice(2).
Kenapa process.argv[2] bernilai undefined?
Karena program dijalankan tanpa argumen itu. Beri nilai default (process.argv[2] ?? 'guest'), atau cetak baris petunjuk pemakaian lalu berhenti dengan process.exit(1).
Sebaiknya pakai yargs atau commander daripada process.argv?
Untuk script dengan beberapa flag, util.parseArgs sudah bawaan dan cukup. Package seperti commander dan yargs menambahkan teks bantuan, subcommand, dan validasi, yang mulai terasa manfaatnya saat alatmu punya beberapa perintah.