40

Linux上でAWSEC2で実行されているNode.JSアプリケーションがあり、fsモジュールを使用してHTMLテンプレートファイルを読み込みます。アプリケーションの現在の構造は次のとおりです。

/server.js
/templates/my-template.html
/services/template-reading-service.js

HTMLテンプレートは常にその場所にありますが、template-reading-serviceは別の場所(より深いサブディレクトリなど)に移動する場合があります。template-reading-service内からfs.readFileSync()を使用してファイルをロードします、 そのようです:

var templateContent = fs.readFileSync('./templates/my-template.html', 'utf8');

これにより、次のエラーがスローされます。

Error: ENOENT, no such file or directory './templates/my-template.html'

これは、パス'./'がアプリケーションルートではなく'/services/'ディレクトリに解決されているためだと思います。パスを「../templates/my-template.html」に変更しようとしましたが、それは機能しましたが、「1つ上のディレクトリ」に比べて解決しているだけだと思う​​ので、壊れやすいようです。template-reading-serviceをより深いサブディレクトリに移動すると、そのパスが壊れます。

では、アプリケーションのルートに関連するファイルを参照する適切な方法は何ですか?

4

4 に答える 4

37

試す

var templateContent = fs.readFileSync(path.join(__dirname, '../templates') + '/my-template.html', 'utf8');
于 2012-10-24T15:06:43.530 に答える
33

ノードプロセスが実行されているディレクトリへの絶対ファイルシステムパスを取得するには、process.cwd(). /services/template-reading-service.jsをモジュールとして実装するプロセスとして/server.jsを実行していると仮定すると、 /service/template-reading-service.jsから次の操作を実行できます。

var appRoot = process.cwd(),
    templateContent = fs.readFileSync(appRoot + '/templates/my-template.html', 'utf8');

それが機能しない場合は、 /service/ template-reading-service.jsを別のプロセスとして実行している可能性があります。その場合、そのプロセスを起動するときに、プライマリアプリケーションとして扱いたいパスを渡す必要があります。根。たとえば、/server.js が/service/template-reading-service.jsを別のプロセスとして起動する場合、/ server.jsは独自の process.cwd() を渡す必要があります。

于 2012-10-25T00:53:27.730 に答える
21

受け入れられた答えは間違っています。ハードコーディングpath.join(__dirname, '../templates')は望ましくないことを正確に実行service-XXX.jsし、サブロケーションに移動するとファイルがメインアプリを壊します(指定された例のようにservices/template)。

を使用process.cwd()すると、実行中のプロセスを開始したファイルのルート パスが返されます (したがって、例として a/Myuser/myproject/server.jsが返されます/Myuser/myproject/)。

これは、実行中の node.js アプリケーションからプロジェクト ルートを決定するという質問の複製です。

その質問に対して、__dirname答えはそれに値する適切な鞭打ちを得ました。通行人は緑のマークに注意。

于 2014-05-28T10:52:26.957 に答える