Apakah ini aman digunakan require("path").join
untuk menggabungkan URL, misalnya:
require("path").join("http://example.com", "ok");
//returns 'http://example.com/ok'
require("path").join("http://example.com/", "ok");
//returns 'http://example.com/ok'
Jika tidak, cara apa yang Anda sarankan untuk melakukan ini tanpa menulis kode penuh jika?
node.js
url
string-concatenation
Renato Gama
sumber
sumber
path.posix.join('/one/two/three', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
path.posix.join('http://localhost:9887/one/two/three/', '/four')
, gabungan menghilangkan salah satu garis miring ganda dihttp://
'http://localhost:9887/one/two/three/'.replace(/^\/+|\/+$/, '') + '/' + '/four'.replace(/^\/+|\/+$/, '')
dan Anda dapat melakukannyaString.prototype.trimSlashes = function() { return this.replace(/^\/+|\/+$/, ''); }
jika Anda tidak ingin mengetik ekspresi reguler berulang kali. stackoverflow.com/a/22387870/2537258['http://localhost:9887/one/two/three/', '/four'].map((part) => part. replace(/^\/+|\/+$/, '')).join('/')
Jawaban:
Tidak.
path.join()
Akan mengembalikan nilai yang salah saat digunakan dengan URL.Kedengarannya seperti yang Anda inginkan
url.resolve
. Dari dokumen Node :Sunting: Seperti yang ditunjukkan Andreas dengan benar dalam komentar,
url.resolve
hanya akan membantu jika masalahnya sesederhana contoh.url.parse
juga berlaku untuk pertanyaan ini karena ia mengembalikan bidang yang diformat secara konsisten dan dapat diprediksi melaluiURL
objek yang mengurangi kebutuhan akan "kode penuh jika".sumber
url.resolve('/one/two/three/', 'four')
maka outputnya adalah'one/two/three/four'
.path.posix.join('/one/two/three', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
url.resolve('/one/two/three', 'four') // '/one/two/four'
jawabannya benarurl.resolve()
hanya butuh 2 argumen, sedangkan aspath.join()
butuh sembarang angka. Jadi tergantung pada apa yang Anda lakukan, Anda mungkin perlu melakukan panggilan bersarang, misalnya ..url.resolve(url.resolve(SERVER_URL, pagePath), queryString)
Tidak, Anda tidak boleh menggunakan
path.join()
untuk menggabungkan elemen URL.Ada paket untuk melakukan itu sekarang. Jadi, daripada menemukan kembali roda, tulis semua pengujian Anda sendiri, temukan bug, perbaiki, tulis lebih banyak pengujian, temukan casing edge yang tidak berfungsi, dll., Anda dapat menggunakan paket ini.
url-join
https://github.com/jfromaniello/url-join
Install
npm install url-join
Pemakaian
Cetakan:
' http://www.google.com/a/b/cd?foo=123 '
sumber
Axios memiliki fungsi pembantu yang dapat menggabungkan URL.
sumber
Ketika saya mencoba PATH untuk menggabungkan bagian url saya mengalami masalah.
PATH.join
garis '//' down to '/' dan cara ini membuat url absolut tidak valid (mis. http: // ... -> http: / ...). Bagi saya, perbaikan cepatnya adalah:atau dengan solusi yang diposting oleh Kolonel Panic:
sumber
/assets/foo
:? Ini akan menghasilkan URL relatif-jalur-saat iniassets/foo
.Tidak! Di Windows
path.join
akan bergabung dengan garis miring terbalik. URL HTTP selalu berupa garis miring ke depan.Bagaimana tentang
sumber
["posts/", "2013"].join("/")
?posts//2013
masih merupakan URL yang valid.path.posix.join('/one/two/three', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', 'four') // '/one/two/three/four
,path.posix.join('/one/two/three/', '/four') // '/one/two/three/four
Kami melakukannya seperti ini:
sumber
Jika Anda menggunakan lodash , Anda dapat menggunakan oneliner sederhana ini:
terinspirasi oleh jawaban @Peter Dotchev
sumber
Jika Anda menggunakan Angular, Anda dapat menggunakan Lokasi :
Bekerja hanya pada 2 argumen, jadi Anda harus melakukan panggilan berantai atau menulis fungsi pembantu untuk melakukannya jika diperlukan.
sumber
Ini yang saya gunakan:
contoh:
sumber
/assets/foo
:? Ini akan menghasilkan URL relatif-jalur-saat iniassets/foo
.The WHATWG URL objek konstruktor memiliki
(input, base)
versi, daninput
bisa relatif menggunakan/
,./
,../
. Gabungkan ini denganpath.posix.join
dan Anda dapat melakukan apa saja:sumber
Solusi kustom typescript:
sumber
Solusi saya
Edit: jika Anda ingin mendukung lingkungan windows
Solusi kedua akan menggantikan semua garis miring terbalik, jadi bagian url seperti querystring dan hash juga dapat diubah, tetapi topiknya hanya bergabung dengan jalur url, jadi saya tidak menganggapnya sebagai masalah.
sumber
Ada jawaban kerja lainnya, tetapi saya pergi dengan yang berikut ini. Sebuah combo path.join / URL kecil.
sumber
Ini dapat dilakukan dengan kombinasi jalur Node dan URL :
pathname=
danpath.join
untuk membuat kombinasi yang mungkin:(Anda dapat melihat betapa liberal
path.join
dengan argumen)Mengapa pendekatan ini?
Teknik ini menggunakan pustaka bawaan. Semakin sedikit ketergantungan pihak ketiga semakin baik, dalam hal CVE, pemeliharaan, dll.
PS: Jangan pernah memanipulasi URL sebagai string!
Ketika saya meninjau kode, saya bersikeras tidak pernah memanipulasi URL sebagai string secara manual . Pertama, lihat betapa rumitnya speknya .
Kedua, tidak adanya / adanya garis miring (
/
) di belakang / diawali tidak akan menyebabkan semuanya rusak! Anda tidak boleh melakukan:dan terutama tidak:
Yang baru saja saya temui di basis kode.
sumber