2017-06-17 30 views
1

-Suppose Node.jsの私は、「test.js」と呼ばれるテスト/でテストファイルを持っており、それがfs.readFileSyncはファイル相対ではありませんか?

const file = fs.readFileSync("../file.xml"); 
を持っている「file.xml」

-Supposeと呼ばれる私のプロジェクトのルートにファイルを持っています

node ./tests/test.jsを私のプロジェクトのルートから実行すると、../file.xmlは存在しません。 testsディレクトリ内から同じコマンドを実行すると、動作します。

fs.readFileSyncは、実際にスクリプトが存在する場所ではなく、スクリプトが呼び出されたディレクトリからの相対パスのようです。もし私がfs.readFileSync("./file.xml")をtest.jsに書いていたら、もっと混乱して見えるでしょうし、相対的なパスであるrequireステートメントの中で相対的なものです。

これはなぜですか?

fs.readFileSyncのパスを書き換えないようにするにはどうすればよいですか?

+1

'__dirname'が、必ずしも現在の作業ディレクトリと同じではありませんが、' FSを。 readFileSync() 'は現在の作業ディレクトリを使用します。現在の作業ディレクトリは、あなたがnodeを起動したときのものに設定されている可能性があります。 – jfriend00

答えて

2

あなたは相対的なソースファイルの場所のパス解決することができます - というよりも、現在のディレクトリ - path.resolveを使用して:

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

ありがとうございます。これは機能し、私はそれを受け入れるように誘惑されますが、なぜこれが必要なのでしょうか?私は、私のチームの開発者に、なぜrequireステートメントでは不要なので、余分なステップを説明することができるようにしたいと思います。例:module.jsというルートディレクトリにモジュールがある場合は、test.jsでrequire( "../ module.js")を実行するだけです。 – Arman

+0

現在のディレクトリを使用して相対パスが解決されるためです。また、別のディレクトリを使用して解決したいとします。 [docs](https://nodejs.org/api/fs.html)から:* "ファイル名への相対パスを使うことができますが、このパスはprocess.cwd()に相対的です。 "* – cartant

関連する問題