fs.readFileSync Dosyaya Göre Değil mi? Node.js


104

-Projemin kök dizininde "file.xml" adında bir dosyam olduğunu varsayalım

-Testlerde "test.js" adında bir test dosyam olduğunu ve

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

Şimdi node ./tests/test.jsprojemin kökünden çalıştırırsam ../file.xml yok diyor. Aynı komutu testler dizininden çalıştırırsam, o zaman çalışıyor.

Görünüşe göre fs.readFileSync, betiğin gerçekte olduğu yer yerine, betiğin çağrıldığı dizine bağlıdır. Yazdığım Eğer fs.readFileSync("./file.xml")test.js içinde daha kafa karıştırıcı ve bir dosya görecelidir deyimi gerektiren göreli yolları ile tutarlı değil görünürdü.

Bu neden?

Fs.readFileSync dosyamdaki yolları yeniden yazmak zorunda kalmamayı nasıl önleyebilirim?


3
__dirnamegeçerli çalışma dizini ile aynı olması gerekmez, ancak fs.readFileSync()geçerli çalışma dizinini kullanır. Geçerli çalışma dizini büyük olasılıkla düğümü başlattığınızda olduğu gibi ayarlanmıştır.
jfriend00

Yanıtlar:


181

Yolu, geçerli dizin yerine kaynak dosyanın konumuna göre çözebilirsiniz path.resolve:

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

1
Teşekkür ederim. Bu işe yarıyor ve bunu kabul etmeye can atıyorum, ama bunun neden gerekli olduğuna dair bir fikriniz var mı? Ekibimdeki geliştiricilere, bir gereksinim ifadesinde gerekli olmadığı için neden ekstra adımın gerekli olduğunu açıklamak istiyorum. Ör: module.js adlı kök dizinde bir modülüm olsaydı, test.js'de yalnızca ("../ module.js") gerekir
Arman

10
Çünkü göreli yollar mevcut dizin kullanılarak çözülür. Ve farklı bir dizin kullanarak çözmek istiyorsunuz. Gönderen docs : "Bir dosya adına göreli yol kullanılabilir hatırla Ancak, bu yol process.cwd () göreli olacağı.."
cartant

Bazı nedenlerden dolayı, yerel dosya benim uzak ortamımda çalışmadığı için kafamın içine soktum. dosyayı tam bir url ile almanız gerekir. Ancak, elbette yapmadım ve uzak sunucumdaki mutlak yolu çözmek için bu yöntemi kullanabildim ..
weaveoftheride
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.