Apakah Anda perlu menggunakan path.join di node.js?


134

karena semua orang tahu Windows melakukan jalur dengan garis miring terbalik di mana Unix melakukan jalur dengan garis miring ke depan. node.js menyediakan path.join()untuk selalu menggunakan garis miring yang benar. Jadi misalnya, alih-alih menulis Unix, 'a/b/c'Anda hanya akan melakukannya path.join('a','b','c').

Namun, tampaknya meskipun ada perbedaan ini jika Anda tidak menormalkan jalur Anda (misalnya menggunakan path.join) dan hanya menulis jalur seperti a/b/cnode.js tidak memiliki masalah dengan menjalankan skrip Anda di Windows.

Jadi apakah ada manfaat lebih menulis path.join('a','b','c')lebih 'a/b/c'? Keduanya tampaknya berfungsi terlepas dari platform ...

Jawaban:


106

Sistem file Windows tidak memiliki masalah menggunakan garis miring maju atau mundur sebagai pemisah jalur (ini telah terjadi sejak kembali pada hari-hari DOS). Satu-satunya masalah sebenarnya adalah bahwa prosesor baris perintah Windows (atau, lebih khusus, utilitas baris perintah Windows-asli) cenderung menafsirkan garis miring ke depan sebagai penentu opsi daripada komponen jalur. Oleh karena itu, Anda memerlukan jalur backslashed jika Anda harus meneruskan jalur ke perintah Windows yang dijalankan sebagai subproses. Selain itu, panggilan Windows API (dan metode dari bahasa tingkat tinggi yang memanggil Windows API) yang mengembalikan jalur akan menggunakan garis miring terbalik, jadi bahkan jika Anda tidak meneruskannya ke subproses, Anda harus menormalkannya.


Garis miring ke depan juga merusak jalur UNC.
user2426679

Jawaban ini tidak menjelaskan mengapa menggunakannya dalam aplikasi Node.js yang khas. Atau mungkin hanya aku saja yang tidak mengerti. Meski itu menarik.
Gherman

96

path.join akan menangani pembatas yang tidak perlu, yang mungkin terjadi jika jalur yang diberikan berasal dari sumber yang tidak diketahui (mis. input pengguna, API pihak ketiga, dll.).

Jadi path.join('a/','b') path.join('a/','/b'), path.join('a','b')dan path.join('a','/b')semuanya akan memberi a/b.

Tanpa menggunakannya, Anda biasanya akan membuat harapan tentang awal dan akhir jalur yang digabungkan, mengetahui bahwa mereka hanya tidak memiliki atau satu tebasan.


Kedengarannya agak berguna tetapi menerima jalur yang tidak dicentang sembarang dari sumber yang tidak dikenal terdengar seperti masalah keamanan besar. Itu bukan sesuatu yang harus sering dilakukan.
Gherman

50

Saya menggunakan path.joinuntuk memastikan pemisah folder di tempat yang benar, tidak harus memastikan bahwa ia menggunakan garis miring ke depan versus garis miring. Sebagai contoh:

path.join("/var/www", "test")

Akan dengan benar memasukkan pemisah antara www dan pengujian /var/www/test


2
Saya tidak mengerti poin ini. Jika Anda memiliki skrip tersebut dalam variabel, mengapa tidak menambahkan slash secara manual?
mgol

2
Saya juga kesulitan memahami jawaban ini. Tidak dapat melihat nilai apa pun.
oligofren

23
Karena saya tidak selalu yakin apakah nilai jalur yang saya dapatkan dari sumber lain akan memiliki garis miring atau tidak. Contoh saya di atas dibuat-buat. Seringkali jalur itu bukan kode keras, tetapi sedang ditarik dari file konfigurasi lainnya, input pengguna, perpustakaan, dll.
Timothy Strimple

@TimothyStrimple ~ tempat yang bagus untuk digunakan path.joinadalah jawaban Anda yang lain di sini stackoverflow.com/questions/9027648/… . Jawaban itu membawa saya ke sini untuk pertanyaan lain yang dijawab sendiri :)
Pebbl

23
Saya juga skeptis tentang jawaban itu sampai 5 menit kemudian kode saya meledak return baseDir + relativePath + filename;. Saya segera menggantinya dengan return path.join(baseDir, relativePath, filename);. Ini memang sangat membantu!
Pedro

34

Jawaban singkat:

Semua fs.*fungsi (mis. fs.open, Dll) memperlakukan pathname untuk Anda. Jadi, Anda tidak perlu menggunakan path.joindiri sendiri dan membuat kode Anda tidak terbaca.

Jawaban panjang:

Semua fs.*fungsi panggilan path._makeLong(path), yang pada gilirannya panggilan path.resolve(path), yang memiliki RegExps khusus untuk Windows, yang memperhitungkan garis miring terbalik \atau garis miring /. Anda dapat memeriksanya sendiri dengan melihat kode sumbernya di:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.