path dan URL

Penggabungan jalur, resolusi, dan disiplin penguraian URL pada Node.

Daftar isi

Modul path dan url adalah modul inti Node yang mengelola dua bentuk string penting dalam pemrograman: jalur berkas dan alamat web. Modul path menangani penggabungan, normalisasi, dan penguraian jalur dengan memperhitungkan karakter pemisah platform, sedangkan modul url menguraikan komponen alamat menjadi bagian yang dapat dibaca dan diubah. Setelah membaca topik ini, pembaca dapat membentuk jalur yang portabel antar sistem operasi serta memecah URL menjadi protokol, host, dan parameter kueri tanpa memakai paket eksternal.

Modul path#

Modul path menyediakan fungsi untuk memanipulasi string jalur berkas. Operasi paling lazim adalah penggabungan beberapa segmen menjadi satu jalur yang valid pada platform tempat Node berjalan. Fungsi path.join menerima segmen sebagai argumen dan memakai karakter pemisah yang sesuai platform: garis miring pada POSIX dan garis miring terbalik pada Windows. Fungsi ini juga menangani segmen kosong dan segmen .. secara benar sehingga jalur hasilnya sudah dinormalisasi.

Untuk mengubah jalur relatif menjadi jalur mutlak, fungsi path.resolve dipakai. Bila argumen pertama berupa jalur mutlak, path.resolve menjadikannya basis perhitungan dan mengabaikan direktori kerja proses. Bila seluruh argumen berupa jalur relatif, path.resolve menambahkannya ke process.cwd(), sehingga hasilnya bergantung pada direktori tempat Node dijalankan. Perilaku ini membuat path.resolve tanpa basis mutlak sulit direproduksi pada lingkungan yang berbeda.

Fungsi path.parse mengurai jalur menjadi objek yang berisi root, dir, base, ext, dan name. Kebalikannya, path.format menerima objek serupa dan menghasilkan jalur. Beberapa fungsi pembantu lain sering dipakai. Fungsi path.basename mengembalikan nama berkas dan opsionalnya membuang ekstensi yang diberikan, path.extname mengembalikan ekstensi termasuk titik, serta path.relative menghasilkan jalur relatif dari satu jalur ke jalur lain.

js path-demo.js
const path = require('node:path');

console.log('join:', path.join('data', 'users', 'ali', 'catatan.md'));
console.log('resolve:', path.resolve('/srv/app', 'data', 'users', '..', 'budi'));
console.log('basename:', path.basename('/home/ali/catatan.md', '.md'));
console.log('extname:', path.extname('arsip.tar.gz'));
console.log('relative:', path.relative('/home/ali', '/home/budi/dokumen'));
console.log('parse:', JSON.stringify(path.parse('/home/ali/catatan.md')));
console.log('sep:', JSON.stringify(path.sep));
console.log('delimiter:', JSON.stringify(path.delimiter));
text Keluaran
join: data/users/ali/catatan.md
resolve: /srv/app/data/budi
basename: catatan
extname: .gz
relative: ../budi/dokumen
parse: {"root":"/","dir":"/home/ali","base":"catatan.md","ext":".md","name":"catatan"}
sep: "/"
delimiter: ":"

Perhatikan dua detail pada keluaran di atas. Pertama, path.extname('arsip.tar.gz') mengembalikan .gz, yaitu ekstensi terakhir saja, dan bukan .tar.gz. Kedua, path.delimiter bernilai : pada POSIX dan ; pada Windows, dipakai untuk memisahkan entri pada variabel lingkungan PATH.

Modul url#

Node menyediakan dua API untuk URL. API lama url.parse masih ada tetapi sudah usang dan rentan terhadap celah keamanan terkait parsing. API modern yang dianjurkan adalah kelas URL global, yang mengikuti standar yang sama dengan API URL pada peramban modern. Kelas ini mengurai URL ketika objek dibuat dan menyimpan komponennya sebagai properti yang dapat diakses dan diubah.

Properti utama objek URL mencakup protocol, host, hostname, port, pathname, search, hash, dan href. Properti host memuat port bila ada, sedangkan hostname hanya memuat nama host tanpa port. Properti searchParams adalah objek URLSearchParams yang menyediakan metode get, set, append, delete, dan has untuk memanipulasi parameter kueri. Perubahan pada searchParams langsung tercermin pada search dan href.

js url-demo.js
const { URL } = require('node:url');

const u = new URL('https://contoh.id:8443/api/users?halaman=2&urut=nama#bagian');
console.log('protocol:', u.protocol);
console.log('host:', u.host);
console.log('hostname:', u.hostname);
console.log('port:', u.port);
console.log('pathname:', u.pathname);
console.log('search:', u.search);
console.log('searchParams halaman:', u.searchParams.get('halaman'));
u.searchParams.append('aktif', 'true');
console.log('searchParams setelah append:', u.searchParams.toString());
console.log('hash:', u.hash);
console.log('href:', u.href);
text Keluaran
protocol: https:
host: contoh.id:8443
hostname: contoh.id
port: 8443
pathname: /api/users
search: ?halaman=2&urut=nama
searchParams halaman: 2
searchParams setelah append: halaman=2&urut=nama&aktif=true
hash: #bagian
href: https://contoh.id:8443/api/users?halaman=2&urut=nama&aktif=true#bagian

Konstruktor URL memerlukan URL mutlak agar berhasil. Untuk menggabungkan basis dengan jalur relatif, konstruktor menerima argumen kedua sebagai basis, misalnya new URL('/api/users', 'https://contoh.id') menghasilkan URL lengkap. Pola ini berguna saat merakit endpoint dari konfigurasi host dan rute aplikasi.

Node juga menyediakan modul node:url dengan fungsi fileURLToPath dan pathToFileURL untuk mengonversi antara URL berprotokol file: dan jalur berkas. URL file: dipakai oleh ESM untuk menunjuk berkas modul, sehingga import.meta.url menghasilkan URL berbentuk file:///.../data.js. Ketika kode ESM perlu berinteraksi dengan modul fs yang menerima jalur tradisional, fileURLToPath mengubah URL tersebut menjadi jalur absolut. Konversi ini juga menjaga karakter non-ASCII pada nama berkas agar tetap terenkodasi dengan benar.

Selain path.win32 dan path.posix, modul path juga menyediakan properti path.sep dan path.delimiter yang sudah disinggung. Submodul path.posix dan path.win32 berguna ketika kode harus memanipulasi jalur untuk platform yang berbeda dari platform tempat Node berjalan. Misalnya, server Linux yang merakit jalur untuk klien Windows dapat memakai path.win32.join agar hasilnya memakai garis miring terbalik meskipun sistem operasi server memakai garis miring biasa.

Kesalahan umum#

Beberapa kesalahan berulang muncul saat memakai path dan url. Menyusun jalur dengan penggabungan string manual seperti 'data/' + nama + '/catatan.md' menghasilkan jalur ganda apabila nama sudah diakhiri garis miring, dan jalur rusak pada Windows karena memakai pemisah yang salah. Penggantian dengan path.join('data', nama, 'catatan.md') menyelesaikan keduanya. Pemakaian path.resolve tanpa basis mutlak mengikat keluaran ke direktori kerja, sehingga hasil berbeda ketika skrip dijalankan dari lokasi yang berbeda. Penambahan basis mutlak pada argumen pertama membuat hasil dapat diprediksi.

Penguraian URL dengan url.parse sering mengabaikan perbedaan antara search mentah dan objek query, dan API ini juga tidak menangani URL non-standar dengan benar. Penggantian dengan new URL(...) memberikan perilaku yang konsisten dengan peramban modern. Terakhir, modifikasi searchParams dianggap tidak memengaruhi href, padahal perubahan langsung ditulis kembali ke string URL sehingga href selalu sinkron dengan isi searchParams.

Ringkasan#

  • path.join menggabungkan segmen dengan pemisah yang benar dan menormalkan .., sedangkan path.resolve menghasilkan jalur mutlak dan memerlukan basis mutlak agar dapat diprediksi.
  • path.extname hanya mengembalikan ekstensi terakhir, dan path.parse mengurai jalur menjadi objek dengan root, dir, base, ext, dan name.
  • Kelas global URL mengurai URL menurut standar WHATWG dan menyimpan komponennya sebagai properti yang dapat diubah, dengan searchParams sebagai antarmuka untuk parameter kueri.
  • Hindari url.parse yang sudah usang dan hindari penggabungan string manual untuk jalur maupun URL.

Referensi#

  • Path — Node.js — Referensi resmi modul path beserta tabel kompatibilitas POSIX dan Windows.
  • URL — Node.js — Referensi resmi kelas URL dan URLSearchParams serta catatan migrasi dari url.parse.