2017-06-17 473 views
1

-Suppose我在我的項目的根被稱爲「file.xml」fs.readFileSync不是文件相對? Node.js的

-Suppose我在測試/稱爲「test.js」的測試文件的文件,它有

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

如果我現在從我的項目的根目錄運行node ./tests/test.js它說../file.xml不存在。如果我在tests目錄中運行相同的命令,那麼它就可以工作。

看來fs.readFileSync是相對於腳本被調用的目錄而不是腳本的實際位置。如果我在test.js中寫入fs.readFileSync("./file.xml"),它看起來會更混亂,並且與require文件中的相對路徑不相符。

這是爲什麼?

如何避免重寫我的fs.readFileSync中的路徑?

+1

'__dirname'不一定是一樣的當前工作目錄,但'FS。 readFileSync()'使用當前的工作目錄。當前的工作目錄很可能會設置爲啓動節點時的狀態。 – jfriend00

回答

2

可以解析相對路徑的源文件的位置 - 而不是當前目錄 - 使用path.resolve

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

謝謝。這工作,我很想接受它,但任何想法,爲什麼這是必要的?我希望能夠向我的團隊的開發人員解釋爲什麼額外的步驟,因爲它在需求聲明中不是必需的。例如:如果我在根目錄下有一個名爲module.js的模塊,我只需要在test.js中做require(「../ module.js」) – Arman

+0

因爲相對路徑是使用當前目錄解析的。並且您想要使用不同的目錄進行解析。從[docs](https://nodejs.org/api/fs.html):*「可以使用文件名的相對路徑,但請記住,此路徑將與process.cwd()相關。 「* – cartant