fs.readFileSync không phải là tệp tương đối? Node.js


104

- Giả sử tôi có một tệp trong thư mục gốc của dự án của tôi có tên là "file.xml"

-Giả sử tôi có một tệp thử nghiệm trong các bài kiểm tra / được gọi là "test.js" và nó có

const file = fs.readFileSync("../file.xml");

Nếu bây giờ tôi chạy node ./tests/test.jstừ thư mục gốc của dự án của mình, nó nói ../file.xml không tồn tại. Nếu tôi chạy cùng một lệnh từ trong thư mục kiểm tra, thì nó hoạt động.

Có vẻ như fs.readFileSync liên quan đến thư mục nơi tập lệnh được gọi từ đó, thay vì nơi tập lệnh thực sự ở đó. Nếu tôi đã viết fs.readFileSync("./file.xml")trong test.js, nó sẽ trông khó hiểu hơn và không nhất quán với các đường dẫn tương đối trong câu lệnh request là tệp tương đối.

Tại sao thế này?

Làm cách nào để tránh phải viết lại các đường dẫn trong fs.readFileSync của tôi?


3
__dirnamekhông nhất thiết giống như thư mục làm việc hiện tại, nhưng fs.readFileSync()sử dụng thư mục làm việc hiện tại. Thư mục làm việc hiện tại có thể được đặt thành bất kỳ thứ gì khi bạn khởi chạy nút.
jfriend00

Câu trả lời:


181

Bạn có thể giải quyết đường dẫn liên quan đến vị trí của tệp nguồn - thay vì thư mục hiện tại - bằng cách sử dụng path.resolve:

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

1
Cảm ơn bạn. Điều này hiệu quả và tôi muốn chấp nhận nó, nhưng bất kỳ ý tưởng nào tại sao điều này là cần thiết? Tôi muốn có thể giải thích cho các nhà phát triển trong nhóm của tôi tại sao phải thực hiện thêm bước vì nó không cần thiết trong một câu lệnh yêu cầu. Ví dụ: nếu tôi có một mô-đun trong thư mục gốc được gọi là module.js, tôi chỉ cần thực hiện request ("../ module.js") trong test.js
Arman

10
Bởi vì các đường dẫn tương đối được giải quyết bằng cách sử dụng thư mục hiện tại. Và bạn muốn giải quyết bằng cách sử dụng một thư mục khác. Từ tài liệu : "Có thể sử dụng đường dẫn liên quan đến tên tệp. Tuy nhiên, hãy nhớ rằng đường dẫn này sẽ liên quan đến process.cwd ()."
cartant

vì lý do nào đó, tôi nhận ra rằng vì tệp cục bộ không hoạt động trên môi trường từ xa của tôi mà tôi. sẽ cần lấy tệp bằng một url đầy đủ. Tuy nhiên, tất nhiên tôi không và tôi đã có thể sử dụng phương pháp này để giải quyết các đường dẫn tuyệt đối trên máy chủ từ xa của tôi ..
weaveoftheride
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.