คุณต้องใช้ path.join ใน node.js หรือไม่?


138

อย่างที่ทุกคนรู้ว่า Windows ทำพา ธ ที่มีแบ็กสแลชโดยที่ Unix ทำพา ธ ด้วยเครื่องหมายทับไปข้างหน้า node.js ให้path.join()ใช้สแลชที่ถูกต้องเสมอ ตัวอย่างเช่นแทนที่จะเขียน Unix เท่านั้นที่'a/b/c'คุณจะทำpath.join('a','b','c')แทน

อย่างไรก็ตามดูเหมือนว่าแม้จะมีความแตกต่างนี้หากคุณไม่ทำให้เส้นทางของคุณเป็นปกติ (เช่นใช้ path.join) และเพียงแค่เขียนa/b/cพา ธเช่นnode.js ก็ไม่มีปัญหากับการเรียกใช้สคริปต์ของคุณบน Windows

มีประโยชน์มากกว่าการเขียนpath.join('a','b','c')ทับ'a/b/c'หรือไม่? ทั้งสองดูเหมือนจะทำงานได้โดยไม่คำนึงถึงแพลตฟอร์ม ...

คำตอบ:


107

ระบบไฟล์ของ Windows ไม่มีปัญหาในการใช้เครื่องหมายทับไปข้างหน้าหรือข้างหลังเป็นตัวคั่นเส้นทาง (เป็นเช่นนั้นมาตั้งแต่ย้อนกลับไปใน DOS ปัญหาเดียวที่แท้จริงคือตัวประมวลผลบรรทัดคำสั่งของ Windows (หรือโดยเฉพาะอย่างยิ่งยูทิลิตี้บรรทัดคำสั่งดั้งเดิมของ Windows) มีแนวโน้มที่จะตีความเครื่องหมายทับเป็นตัวระบุตัวเลือกแทนที่จะเป็นส่วนประกอบของเส้นทาง ดังนั้นคุณต้องมีเส้นทางแบ็กสแลชหากคุณต้องการส่งเส้นทางไปยังคำสั่งของ Windows ที่รันเป็นกระบวนการย่อย นอกจากนี้การเรียก Windows API (และวิธีการจากภาษาระดับสูงกว่าที่เรียก Windows API) ที่ส่งคืนพา ธ จะใช้แบ็กสแลชดังนั้นแม้ว่าคุณจะไม่ได้ส่งผ่านไปยังกระบวนการย่อยคุณจะต้องทำให้เป็นมาตรฐาน


เครื่องหมายทับไปข้างหน้ายังทำลายเส้นทาง UNC
user2426679

1
คำตอบนี้ไม่ชัดเจนว่าเหตุใดจึงใช้ในแอป Node.js ทั่วไป หรืออาจจะเป็นแค่ฉันที่ไม่เข้าใจ แม้ว่ามันจะน่าสนใจ
Gherman

98

path.join จะดูแลตัวคั่นที่ไม่จำเป็นซึ่งอาจเกิดขึ้นได้หากแพทช์ที่ระบุมาจากแหล่งที่ไม่รู้จัก (เช่นอินพุตของผู้ใช้ API ของบุคคลที่สามเป็นต้น)

ดังนั้นpath.join('a/','b') path.join('a/','/b'), path.join('a','b')และจะให้ทั้งหมดpath.join('a','/b')a/b

โดยไม่ต้องใช้มันคุณมักจะคาดหวังเกี่ยวกับจุดเริ่มต้นและจุดสิ้นสุดของการปะติดปะต่อโดยรู้ว่าพวกเขาไม่มีหรือเฉือนเพียงครั้งเดียว


ฟังดูมีประโยชน์เล็กน้อย แต่การรับเส้นทางที่ไม่ถูกตรวจสอบโดยพลการจากแหล่งที่ไม่รู้จักดูเหมือนจะเป็นปัญหาด้านความปลอดภัยที่ยิ่งใหญ่ นั่นไม่ใช่สิ่งที่ต้องทำบ่อยๆ
Gherman

50

ฉันใช้path.joinเพื่อให้แน่ใจว่าตัวคั่นโฟลเดอร์อยู่ในตำแหน่งที่ถูกต้องไม่จำเป็นต้องแน่ใจว่าใช้เครื่องหมายทับไปข้างหน้าและข้างหลัง ตัวอย่างเช่น:

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

จะแทรกตัวคั่นระหว่าง www และ test อย่างถูกต้อง /var/www/test


2
ฉันไม่เข้าใจประเด็นนี้ หากคุณมีสคริปต์เหล่านั้นในตัวแปรทำไมไม่เพิ่มเครื่องหมายทับด้วยตนเอง
mgol

2
ฉันยังมีปัญหาในการทำความเข้าใจคำตอบนี้ มองไม่เห็นค่าใด ๆ
oligofren

24
เพราะฉันไม่แน่ใจเสมอไปว่าค่าพา ธ ที่ฉันได้รับจากแหล่งอื่นจะมีเครื่องหมายทับหรือไม่ ตัวอย่างของฉันข้างต้นถูกสร้างขึ้น บ่อยครั้งที่เส้นทางเหล่านั้นไม่ได้เข้ารหัสอย่างหนัก แต่จะถูกดึงออกจากไฟล์กำหนดค่าอื่น ๆ อินพุตของผู้ใช้ไลบรารี ฯลฯ
Timothy Strimple

@TimothyStrimple ~ เป็นสถานที่ที่ดีในการใช้path.joinคำตอบอื่น ๆ ของคุณที่นี่stackoverflow.com/questions/9027648/… . คำตอบนั้นทำให้ฉันไปสู่คำถามอื่นที่คุณตอบเอง :)
Pebbl

23
ผมยังสงสัยเกี่ยวกับคำตอบที่ว่าจนถึง 5 return baseDir + relativePath + filename;นาทีต่อมารหัสของฉันพัดขึ้นบน return path.join(baseDir, relativePath, filename);ฉันแทนที่ได้ทันทีโดย มันมีประโยชน์มากจริงๆ!
Pedro

34

คำตอบสั้น ๆ :

fs.*ฟังก์ชันทั้งหมด(เช่นfs.openฯลฯ ) ถือว่าชื่อพา ธ สำหรับคุณ ดังนั้นคุณไม่จำเป็นต้องใช้path.joinตัวเองและทำให้รหัสของคุณอ่านไม่ออก

คำตอบยาว:

ทุกfs.*ฟังก์ชั่นโทรpath._makeLong(path)ซึ่งในการเรียกเปิดpath.resolve(path)ซึ่งมี regexps พิเศษสำหรับ Windows ซึ่งจะนำเข้าบัญชีทับขวาหรือเครื่องหมายทับ\ /คุณสามารถตรวจสอบด้วยตัวคุณเองเพื่อดูซอร์สโค้ดของพวกเขาได้ที่:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.