2012-11-18 20 views
6

"server.js"というNode.jsファイルがあります。私のCD server.jsがあるディレクトリにあれば、フォルダ外からNode.jsファイルを実行すると、ファイルパスが破損する

bashシェルを使用して
var certPem = fs.readFileSync('cert_and_key_dev.pem', encoding='ascii'); 

、およびコマンドを実行します:スクリプトで

、私のようなものを使用していくつかのファイルを開封しております

[mybashshell] $ノードserver.jsそれが動作

、私はエラーを得ません。サーバーが起動して実行されます。

ここで、server.jsファイルのあるディレクトリからcdすると、同じシェルコマンドを再度実行してサーバを起動します。

私の "cert_and_key_dev.pem"へのファイルパスが壊れていると文句を言っています。

私はこれが起こるようなことは期待していませんでした。私は実行されているスクリプトファイルで使用されているパスは、私がbashシェルコマンドを実行した場所ではなく、スクリプトファイルからの相対パスでなければなりません。

アイデア?

答えて

13

スクリプトの先頭に貼り付けます。

process.chdir(__dirname); 

これが実行されている(__dirname)ファイルのディレクトリパスにプロセスの作業ディレクトリを変更します。

機能の詳細については、thisを参照してください。

+0

このメソッドとchbrownのメソッドとの間には何か利点はありますか?私はより適切な方法であるかどうか不思議です。 – Zhang

+0

本当に目的にかかっています。より多くの "サーバ"を走らせているなら、私は '__dirname'に変更することを提案します。たとえば、フォルダアップロードスクリプトを実行していた場合は、chbrownのコードを使用することをお勧めします。現在の作業ディレクトリのパスを現在のスクリプトのディレクトリパスよりもどのくらいの頻度で使用するかを検討する必要があります。 –

7

それとも

var path = require('path'); 
var key = path.join(__dirname, 'cert_and_key_dev.pem'); 
var certPem = fs.readFileSync(key, encoding='ascii'); 

あなたはどのような理由のためにcdにしたくない場合。

+0

LOL、ありがとう、彼らはどちらも動作しますが、どちらを受け入れるべきか分かりません。私はJulian Lanniganに最初に答えたので、私はそれを与えるだろうし、repブーストを使用することができます(あなたがchbrownを気にしないことを願って)。 – Zhang

+1

不確かな場合は、コードが少なくなります。スクリプトを開始したディレクトリを知る必要がない場合は、Julianの答えが良いです。 – chbrown

+0

しかし、Zhang氏は、変数を変更する前に常に変数に現在の作業ディレクトリを保存できることを覚えておいてください。 'process.cwd()'を呼び出す –

関連する問題