日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nodejs 当前文件路径_NodeJs的几种文件路径

發布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nodejs 当前文件路径_NodeJs的几种文件路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上次寫刪除文件夾的時候用到了fs模塊,也集中用到了很多種路徑,當時就想寫一下,在Node中使用各種路徑的問題,于是就簡單寫了一下,可以從 這里 獲取demo源代碼。

剛寫Node的時候經常會遇到這種情況:比如項目入口是app.js,而app.js并不一定在根目錄下,比如他在bin目錄下,到了啟動項目時,使用node /bin/app.js和進入bin文件夾直接node app.js總會有一個起不起來,都是些路徑找不到的錯誤,究其原因就是啟動應用時執行的目錄不同了,不過為什么啟動腳本的位置會有這么多影響呢,讓我們來總結一下。

對比常用的幾種路徑

Node 中的文件路徑大概有 __dirname,__filename,process.cwd(),./ 或者 ../。前三個都是絕對路徑,為了便于比較,./ 和 ../ 我們通過 path.resolve('./')來轉換為絕對路徑。先看一個簡單的例子。

假如我們有這樣的文件結構:

在 server.js 里編寫如下的代碼:1

2

3

4

5

6var path = require('path');

console.log(__dirname);

console.log(__filename);

console.log(process.cwd());

console.log(path.resolve('./'));

在 path-test 目錄下運行 node bin/server.js 得到的結果:

進入 bin 目錄下運行 node server.js 得到的結果:

現在我們可以總結下這幾個路徑的意思:1

2

3

4__dirname: Nodejs的一個全局變量,獲得當前執行文件所在目錄的完整目錄名

__filename: Nodejs的一個全局變量,獲得當前執行文件的帶有完整絕對路徑的文件名

process.cwd():Nodejs的全局變量process的一個方法,返回當前進程的工作目錄

./: 一般情況跟 process.cwd() 一樣,返回 node 命令運行時所在的文件夾的絕對路徑

注意__dirname得到的目錄和命令執行所在的目錄、__filename得到的文件名和參數指定的文件名都不一定相同,因為可能在一個文件中調用了另一個目錄中的另一個文件。

更復雜的情況

我們把例子升級一下,在bin目錄下新建一個test.js:1

2

3

4

5

6

7var fs = require('fs');

require('./server.js');

fs.readFile('./server.js', function (err, data){

if (err) return console.log(err);

console.log(data);

});

現在目錄結構如下:

我們這次先進入bin目錄執行node test.js,得到的結果:

可以看到是正常的,然后我們退出bin目錄,在上一級執行node bin/test.js,得到結果:

我們可以看到報錯了,但是require是OK的,只是fs.readFile時路徑出現了錯誤。從第一個例子我們可以知道,使用相對路徑出現錯誤是預期之內的,因為在bin目錄外執行時目錄下已經沒有server.js這個文件了,但是為什么在require中使用相對路徑,就不受啟動應用時執行命令目錄不同的影響呢?實際上是require有自己的搜索機制,具體可以看require() 源碼解讀。

使用path模塊處理文件路徑

面對復雜的路徑問題,path模塊可以幫你規范化連接和解析路徑,還可以用于絕對路徑到對路徑的轉換、提取路徑的組成部分及判斷路徑是否存在等。常用的兩個命令:

path.join

path.join()方法可以連接任意多個路徑字符串,只是簡單的連接,不會看是否真的存在。1

2

3

4

5var path = require('path');

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')

// 連接后

'/foo/bar/baz/asdf'

path.resolve

path.resolve()方法可以將多個路徑解析為一個規范化的絕對路徑。其處理方式類似于對這些路徑逐一進行cd操作,與cd操作不同的是,這引起路徑可以是文件,并且可不必實際存在(resolve()方法不會利用底層的文件系統判斷路徑是否存在,而只是進行路徑字符串操作)。1path.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile')

其處理方式類型于1

2

3

4

5cd foo/bar

cd /tmp/file/

cd ..

cd a/../subfile

pwd

如果解析的不是絕對路徑,path.resolve()會將當前工作目錄(非進程工作目錄)加到解析結果的前面。例如:1

2

3

4

5

6

7

8

9

10

11path.resolve('/foo/bar', './baz')

// 輸出結果為

'/foo/bar/baz'

path.resolve('/foo/bar', '/tmp/file/')

// 輸出結果為

'/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif')

// 當前的工作路徑是 /Users/tyb/workspace/NodeJs/path-test/bin,則輸出結果為

'/Users/tyb/workspace/NodeJs/path-test/bin/wwwroot/static_files/gif/image.gif'

兩者區別join只是把各個path片段連接在一起, resolve會把‘/’當成根目錄1

2path.join('/a', '/b') // 返回 '/a/b'

path.resolve('/a', '/b') // 返回 '/b'join直接拼接字段,resolve解析路徑,如果解析的不是絕對路徑,會在前面增加當前文件所在的目錄1

2path.join("a", "b1", "..", "b2") // 返回 'a/b2'

path.resolve("a", "b1", "..", "b2") // 返回 '/Users/tyb/workspace/NodeJs/path-test/bin/a/b2'

相同之處都會規范化路徑

都不會去驗證路徑是否真的存在

總結一下

最好只在 require() 時才使用相對路徑./或者../的寫法,其他地方一律配合path`模塊使用絕對路徑。

參考鏈接

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的nodejs 当前文件路径_NodeJs的几种文件路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。