亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

nodejs的路徑問題的解決

2019-11-19 13:35:09
字體:
來源:轉載
供稿:網友

最近公司的一個開發項目,后端用的是nodejs。這兩天需要打包給客戶演示,就讓公司一個小伙把之前3D機房的打包工具移植過來。打包之后,發現原本在開發環境下的跑的好好的項目,不能訪問了。出現項目的首頁不能訪問的問題:

can not get file index.html

express.static

問題出在哪兒?

nodejs后端的用了express,index.html是一個靜態文件。我們知道,通過 Express 內置的 express.static 可以方便地托管靜態文件,例如圖片、CSS、JavaScript 文件等。

將靜態資源文件所在的目錄作為參數傳遞給 express.static 中間件就可以提供靜態資源文件的訪問了。例如,假設在 public 目錄放置了圖片、CSS 和 JavaScript 文件,可以使用如下代碼:

 app.use(express.static('public'));

所以,找到項目中的代碼,查看static調用的地方,和上面一行代碼很一樣:

 app.use(express.static('public'));

到此,我已經發現了問題,我告訴小伙伴,這個地方不用相對路徑可以解決這個問題。由于打包時間限制,我讓小伙伴先簡單處理下,打完包之后,在來整理下思路:

app.use(express.static('resource/public'));

當然最重要的是,這個問題其實不難,自己多鉆研下,很容易發現問題,也就不會出這個問題,所以小伙伴自己打手心吧。

恩,你沒看錯,這個地方還是相對目錄。后續產品中會改成比較好的一種情況。

express.static方法解析

事實上,express.static方法如果傳入的是相對路徑,express會自己把他轉換為絕對路徑,我們可以查看下源代碼,在express.js找到如下代碼:

exports.static = require('serve-static');

說明static 調用了serve-static這個包,直接找到這個包,查看index.js, 可以看到代碼,下面列出重要的兩行

 ...var resolve = require('path').resolve...opts.root = resolve(root)...

這兩行就是,express把相對目錄轉換成絕對目錄的代碼,可以看出,最終使用的path這個內置對象的resolve方法,繼續往下看。

path對象的resolve方法

直接查看這個方法的api文檔,如下:https://nodejs.org/api/path.html#path_path_resolve_paths

下面是這個方法的解釋:

The path.resolve() method resolves a sequence of paths or path segments into an absolute path.

啥意思呢? 就是這個方法把一系列的paths或者path segments 組織成一個絕對路徑,比如

 path.resolve('/foo','bar');// return /foo/bar

詳細的說明請自行參考文檔,這個地方有一句話需要特別注意:

If after processing all given path segments an absolute path has not yet been generated, the current working directory is used.

啥意思,就是如果處理完了所有的path segments,也沒有生成一個絕對路徑, 就要使用 當前工作目錄(current working directory)。比如:

 path.resolve('bar');// 加上 /Users/terry 是當前工作目錄, return /Users/terry/bar

api文檔中一個比較復雜的示例(此處注意resolve的時候,從右到左,參考文檔了解詳情):

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');// if the current working directory is /home/myself/node,// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

現在的問題是,啥是當前工作目錄。

nodejs 當前工作目錄 current working directory

nodejs 當前工作目錄是啟動Node的目錄。也就是說,從哪個目錄進去啟動node,就返回哪個目錄。 

注意,這個目錄不是指js文件所在的目錄

通過process.cwd()方法可以獲取當前工作目錄。

下面通過一個示例來介紹這個當前工作目錄,假如在/Users/terry/Documents/JSWorkspace目錄下寫一個js文件,test.js,代碼只有一行:

console.log(process.cwd());

此時如果,在目錄/Users/terry/Documents/JSWorkspace下面執行命令 :node test.js 輸出如下:

 /Users/terry/Documents/JSWorkspace

但是如果在在目錄/Users/terry/Documents/下面執行命令:node ./JSWorkspace/test.js,輸出的結果是:

/Users/terry/Documents

因此可以看出你在那個目錄執行node命令,當前目錄就是那個目錄。

回到之前的打包的問題,由于在開發階段,一般都是直接在js文件所在目錄執行node命令,所以相對目錄寫的是相對于當前js文件的目錄沒有問題。

可是打包之后,node的執行放到了js目錄的上一層去了。此時相對目錄“public”不在是相對于js文件的相對目錄,而是相對于上一層的,自然就找不到這個文件夾了,從而也找不到該文件夾下的index.html文件。

如何解決

解決的方法:

1.在前面已經說過了,改這個相對目錄。但這種方法很蹩腳。因為,啟動node命令的目錄可能會變;而是如果這應該,開發階段的node命令執行也需要跟著改。 總之不是兼容性很好的方法。

2.直接使用絕對路徑。 但是這個絕對路徑在不同的機器上又不一樣,該如何解決呢?可以考慮使用全局變量__dirname.

全局變量__dirname

查看api文檔 https://nodejs.org/api/modules.html#modules_dirname

看到解釋如下:

The directory name of the current module. This is the same as the path.dirname() of the __filename。

啥意思呢,及時返回nodejs 的js文件的所在目錄。

有了這個變量之后,我們就可以用如下代碼解決這個問題。

app.use(express.static(__dirname + '/public'));

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产v日韩v亚洲| 狠狠做深爱婷婷久久综合一区| 69视频在线播放| 亚洲日韩第一页| 91精品国产777在线观看| 97婷婷涩涩精品一区| 日本精品性网站在线观看| 欧美第一页在线| 久久福利网址导航| 亚洲一区二区三区视频| 7777精品久久久久久| 精品香蕉在线观看视频一| 欧美精品手机在线| 久久久久久久久电影| 精品国产拍在线观看| 日韩av在线不卡| 欧美日韩免费在线| 国产精品丝袜久久久久久不卡| 欧美亚洲在线观看| 亚洲激情电影中文字幕| 91理论片午午论夜理片久久| 国产日产久久高清欧美一区| 韩国三级日本三级少妇99| 97精品视频在线| 精品亚洲国产视频| 亚洲免费成人av电影| 国产精品夜色7777狼人| 精品伊人久久97| 国产精品成人免费电影| 欧美在线视频a| 欧美与欧洲交xxxx免费观看| 26uuu亚洲国产精品| 国产精品在线看| 奇米一区二区三区四区久久| 久久综合亚洲社区| 亚洲欧美在线一区| 在线观看免费高清视频97| 欧美另类极品videosbest最新版本| 亚洲天堂免费观看| 亚洲欧美制服另类日韩| 亚洲网站在线播放| 国产精品自产拍在线观看中文| 狠狠色狠狠色综合日日五| 国产在线999| 日韩一区视频在线| 亚洲成人精品视频| 久久影院免费观看| 性欧美视频videos6一9| 国产精品一区二区三区成人| 欧美国产精品日韩| 日韩视频一区在线| xvideos国产精品| 欧美日韩xxxxx| 91免费高清视频| 亚洲色图美腿丝袜| 亚洲欧美在线播放| 国语自产精品视频在线看一大j8| 日韩中文字幕在线视频播放| 精品中文视频在线| 国产精品亚洲视频在线观看| 亚洲精品乱码久久久久久金桔影视| 日韩欧美极品在线观看| 伊人伊成久久人综合网站| 日韩av大片在线| 色综合亚洲精品激情狠狠| 亚洲视频电影图片偷拍一区| 亚洲精品乱码久久久久久按摩观| 中文字幕亚洲天堂| 深夜福利国产精品| 国产69久久精品成人看| 综合激情国产一区| 九九精品视频在线观看| 成人有码在线视频| 欧美激情免费观看| 国产日韩欧美中文| 亚洲丁香婷深爱综合| 欧美插天视频在线播放| 欧美激情国产日韩精品一区18| 久久中文字幕国产| 北条麻妃一区二区三区中文字幕| 午夜精品视频网站| 亚洲图片在区色| 亚洲高清色综合| 国产欧美日韩免费看aⅴ视频| 欧美成人h版在线观看| 国产精品91久久久久久| 久久影视电视剧凤归四时歌| 久久精品国产96久久久香蕉| 亚洲精品国产免费| 国产免费一区二区三区香蕉精| 欧美特级www| 亚洲欧美变态国产另类| 欧美乱人伦中文字幕在线| 国产美女高潮久久白浆| 日本人成精品视频在线| 国产日韩一区在线| 日本精品久久久久影院| **欧美日韩vr在线| 久热99视频在线观看| 色婷婷亚洲mv天堂mv在影片| 欧美日韩一二三四五区| 精品国产乱码久久久久久婷婷| 最新国产精品亚洲| 国产亚洲精品久久久久久牛牛| 亚洲爱爱爱爱爱| 亚洲女人被黑人巨大进入al| 亚洲人成77777在线观看网| 国产精品福利片| 国产精品成久久久久三级| 亚洲精美色品网站| 精品国产视频在线| 欧美性xxxx极品高清hd直播| 影音先锋日韩有码| 成人精品在线视频| 日韩精品免费综合视频在线播放| 丝袜一区二区三区| 91精品久久久久久久久中文字幕| 国产噜噜噜噜噜久久久久久久久| 国产精品亚洲美女av网站| 乱亲女秽乱长久久久| 欧美日韩一区二区三区| 国产91在线播放九色快色| 日韩在线观看免费高清| 欧美在线激情视频| 亚洲高清福利视频| 成人免费午夜电影| 日韩av网站在线| 欧美精品国产精品日韩精品| 中文字幕欧美精品日韩中文字幕| 欧美大片在线免费观看| 亚洲成人a级网| 亚洲精品免费网站| 国产亚洲视频在线观看| 国产日本欧美在线观看| 欧美电影在线观看网站| 国产精品日韩欧美大师| 国产精品久久婷婷六月丁香| 亚洲在线第一页| 国产亚洲精品成人av久久ww| 4p变态网欧美系列| 日日狠狠久久偷偷四色综合免费| 91最新国产视频| 亚洲日本欧美日韩高观看| 亚洲男人av电影| 日韩av毛片网| 欧美乱大交xxxxx另类电影| 日韩免费观看在线观看| 国产91色在线| 在线电影中文日韩| 日韩视频精品在线| 久久久精品欧美| 色哟哟入口国产精品| 8050国产精品久久久久久| 深夜福利国产精品| 精品亚洲永久免费精品| 中文字幕在线视频日韩| 久久综合免费视频| 欧美精品在线极品| 亚洲第一福利网站| 91高潮精品免费porn| 欧美午夜性色大片在线观看| 欧美日韩视频免费播放| 国产精品欧美亚洲777777| 97精品视频在线播放|