2012-11-18 97 views
6

我有一個名爲「server.js」的Node.js文件。從文件夾外執行Node.js文件中斷文件路徑

在腳本中,我使用的東西就像打開某些文件:

var certPem = fs.readFileSync('cert_and_key_dev.pem', encoding='ascii'); 

使用bash shell,如果我cd到其中server.js是,並運行該命令的目錄:

[mybashshell] $節點server.js

它的工作原理,我沒有錯誤。服務器啓動並運行。

現在,當我輸出server.js文件所在的目錄時,再次運行相同的shell命令來啓動我的服務器。

它抱怨我的文件路徑到我的「cert_and_key_dev.pem」被破壞。

我並不期待這樣的事情發生。我雖然正在執行的腳本文件中使用的路徑應該是相對於腳本文件,而不是執行我的bash shell命令的位置。

任何想法?

回答

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

大聲笑,謝謝你們,他們都工作,但我不知道哪一個可以接受,希望我能給出兩個答案。我會把它交給Julian Lannigan,因爲他先回答並可以使用rep升壓(希望你不介意chbrown)。 – Zhang

+1

如有疑問,代碼獲勝的次數會減少。如果你不需要知道你的腳本是從哪個目錄開始的,Julian的答案會更好。 – chbrown

+0

但是請記住張,你可以在改變之前將當前工作目錄存儲在一個變量中。調用'process.cwd()' –