Bạn có cần sử dụng path.join trong node.js không?


134

như mọi người đều biết Windows thực hiện các đường dẫn với dấu gạch chéo ngược trong đó Unix thực hiện các đường dẫn với dấu gạch chéo về phía trước. node.js cung cấp path.join()để luôn luôn sử dụng dấu gạch chéo chính xác. Vì vậy, ví dụ thay vì viết Unix chỉ 'a/b/c'bạn sẽ làm path.join('a','b','c')thay thế.

Tuy nhiên, dường như bất chấp sự khác biệt này nếu bạn không bình thường hóa các đường dẫn của mình (ví dụ: sử dụng path.join) và chỉ viết các đường dẫn như a/b/cnode.js không có vấn đề gì với việc chạy các tập lệnh của bạn trên Windows.

Vì vậy, có bất kỳ lợi ích hơn bằng văn bản path.join('a','b','c')hơn 'a/b/c'? Cả hai dường như hoạt động bất kể nền tảng ...

Câu trả lời:


106

Các hệ thống tập tin Windows không gặp vấn đề gì khi sử dụng dấu gạch chéo tiến hoặc lùi làm dấu tách đường dẫn (điều này đã xảy ra kể từ thời DOS trở lại). Vấn đề thực sự duy nhất là các bộ xử lý dòng lệnh Windows (hay cụ thể hơn là các tiện ích dòng lệnh gốc Windows) có xu hướng diễn giải các dấu gạch chéo về phía trước như là các chỉ định tùy chọn thay vì các thành phần đường dẫn. Do đó, bạn cần một đường dẫn bị gạch chéo ngược nếu bạn cần chuyển một đường dẫn đến lệnh Windows chạy dưới dạng một quy trình con. Ngoài ra, các lệnh gọi API Windows (và các phương thức từ các ngôn ngữ cấp cao hơn gọi API Windows) sẽ trả về các đường dẫn ngược, vì vậy ngay cả khi bạn không chuyển chúng sang các quy trình con, bạn sẽ cần bình thường hóa chúng.


Chém về phía trước cũng phá vỡ các con đường UNC.
user2426679

Câu trả lời này không làm rõ lý do tại sao sử dụng nó trong các ứng dụng Node.js điển hình. Hoặc có thể chỉ là tôi không nhận được nó. Mặc dù nó rất thú vị.
Gherman

95

path.join sẽ quan tâm đến các dấu phân cách không cần thiết, điều đó có thể xảy ra nếu các đường dẫn cụ thể đến từ các nguồn không xác định (ví dụ: đầu vào của người dùng, API của bên thứ 3, v.v.).

Vì vậy path.join('a/','b') path.join('a/','/b'), path.join('a','b')path.join('a','/b')tất cả sẽ cho a/b.

Không sử dụng nó, bạn thường sẽ đưa ra những kỳ vọng về sự bắt đầu và kết thúc của những con đường được tham gia, biết rằng chúng chỉ không có hoặc có một dấu gạch chéo.


Nghe có vẻ hơi hữu ích nhưng việc nhận các đường dẫn không được kiểm tra tùy ý từ các nguồn không xác định nghe có vẻ như là một vấn đề bảo mật lớn. Đó không phải là việc cần làm thường xuyên.
Gherman

50

Tôi sử dụng path.joinđể đảm bảo các dấu tách thư mục ở đúng vị trí, không nhất thiết phải đảm bảo rằng nó sử dụng dấu gạch chéo so với lùi. Ví dụ:

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

Sẽ chèn chính xác dải phân cách giữa www và test /var/www/test


2
Tôi không hiểu điểm này. Nếu bạn có các tập lệnh đó trong các biến, tại sao không thêm một dấu gạch chéo bằng tay?
mgol

2
Tôi cũng gặp khó khăn khi hiểu câu trả lời này. Không thể thấy bất kỳ giá trị.
oligofren

23
Bởi vì tôi không phải lúc nào cũng chắc chắn liệu các giá trị đường dẫn tôi nhận được từ các nguồn khác sẽ có dấu gạch chéo hay không. Ví dụ của tôi ở trên đã bị chiếm đoạt. Thường thì những đường dẫn đó không được mã hóa cứng, nhưng đang được kéo từ các tệp cấu hình khác, đầu vào của người dùng, thư viện, v.v.
Timothy Strimple

@TimothyStrimple ~ một nơi tốt để sử dụng path.joinsẽ là câu trả lời khác của bạn ở đây stackoverflow.com/questions/9027648/ . Câu trả lời đó đã dẫn tôi đến đây một câu hỏi khác do chính bạn trả lời :)
Pebbl

23
Tôi cũng hoài nghi về câu trả lời đó cho đến 5 phút sau, mã của tôi xuất hiện return baseDir + relativePath + filename;. Tôi thay thế nó ngay lập tức return path.join(baseDir, relativePath, filename);. Nó thực sự rất hữu ích!
Pedro

34

Câu trả lời ngắn:

Tất cả các fs.*chức năng (ví dụ fs.open, v.v.) xử lý tên đường dẫn cho bạn. Vì vậy, bạn không cần phải sử dụng path.joinchính mình và làm cho mã của bạn không thể đọc được.

Câu trả lời dài:

Tất cả các fs.*chức năng gọi path._makeLong(path), lần lượt gọi path.resolve(path), có RegExps đặc biệt cho Windows, có tính đến dấu gạch chéo ngược \hoặc dấu gạch chéo chuyển tiếp /. Bạn có thể tự kiểm tra xem mã nguồn của họ tại:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.