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

首頁 > 開發 > JS > 正文

nodejs的路徑問題的解決

2024-05-06 16:45:05
字體:
來源:轉載
供稿:網友

最近公司的一個開發項目,后端用的是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'));

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合中文字幕68页| 精品国产老师黑色丝袜高跟鞋| 亚洲免费人成在线视频观看| 国产午夜精品一区二区三区| 国产日韩精品在线播放| 欧美午夜性色大片在线观看| 国产亚洲精品激情久久| 亚洲精品电影网站| 亚洲人成在线一二| 亚洲影院高清在线| 久久久精品一区二区三区| 国产精品色婷婷视频| 日本成人黄色片| 久久久人成影片一区二区三区观看| 国产裸体写真av一区二区| 性视频1819p久久| 欧美激情视频在线| 久久久久久久av| 亚洲美女视频网站| 国产有码在线一区二区视频| 播播国产欧美激情| 久久影院模特热| 亚洲第一福利视频| 91亚洲国产精品| 亚洲最大成人在线| 久久久这里只有精品视频| 久久久精品久久久| 国产精品美女999| 亚洲国产天堂久久综合网| 亚洲精品网站在线播放gif| 国产一区二区黄| 国产精品久久久久久久久久久久久| 久久不射热爱视频精品| 亚洲中国色老太| 国产精品久久久久久av| 成人午夜高潮视频| 亚洲激情第一页| 久久免费国产精品1| 色偷偷888欧美精品久久久| 精品日韩视频在线观看| 亚洲白拍色综合图区| 亚洲美女福利视频网站| 91亚洲国产成人久久精品网站| 欧美午夜www高清视频| 欧美色另类天堂2015| 国产精品偷伦视频免费观看国产| 夜夜嗨av一区二区三区四区| 亚洲第一页中文字幕| 久久久久国产精品免费| 国产精品99久久99久久久二8| 久久91超碰青草是什么| 久久精品免费电影| 成人妇女淫片aaaa视频| 日韩电视剧免费观看网站| 亚洲欧美成人在线| 亚洲第一黄色网| 中文日韩在线视频| 亚洲一区二区三区四区视频| 亚洲在线视频观看| 国产在线精品成人一区二区三区| 久久亚洲春色中文字幕| 日韩欧美精品在线观看| 国产偷国产偷亚洲清高网站| 国产成人鲁鲁免费视频a| 国产脚交av在线一区二区| 欧美激情视频网站| 成人免费视频在线观看超级碰| 亚洲精品永久免费精品| 日韩在线中文视频| 九色91av视频| 亚洲在线观看视频| 亚洲性生活视频在线观看| 国产国产精品人在线视| 亚洲无限乱码一二三四麻| 国产成人精品久久二区二区91| 色偷偷偷综合中文字幕;dd| 欧美激情视频一区| 国产丝袜一区二区三区免费视频| 亚洲日本成人网| 午夜精品久久久久久99热| 97在线免费视频| 亚洲成人国产精品| 亚洲一区久久久| 国产欧美日韩中文字幕| 97精品国产97久久久久久春色| 欧美国产日韩xxxxx| 日韩精品免费在线| 免费99精品国产自在在线| 亚洲欧美日韩精品久久亚洲区| 日韩天堂在线视频| 国产一区二区三区视频免费| 久久久久国产精品免费| 欧美激情一区二区三区久久久| 久久国产精品首页| 国产免费一区二区三区在线能观看| 国产亚洲视频在线| 国产精品成人播放| 国产+成+人+亚洲欧洲| 亚洲欧美日韩第一区| 亚洲欧美激情视频| 国产精品狠色婷| 不卡在线观看电视剧完整版| 精品亚洲永久免费精品| www.日韩不卡电影av| 亚洲免费av片| 国产精品久久久久久亚洲调教| 欧美视频在线看| xxxx性欧美| 中文在线资源观看视频网站免费不卡| 中文字幕日韩精品有码视频| 中文字幕亚洲一区在线观看| 91九色国产在线| 国产精品自产拍在线观看中文| 在线精品高清中文字幕| 51午夜精品视频| 欧美成人精品激情在线观看| 久久免费福利视频| 国产精品精品久久久久久| 欧美激情网站在线观看| 久久久国产精品亚洲一区| 在线亚洲国产精品网| 久久伊人91精品综合网站| 91精品在线看| 日韩av网址在线| 中文字幕一区二区三区电影| 亚洲精品国产品国语在线| 日韩中文理论片| 中文字幕久久精品| 欧美日韩亚洲网| 久久精品久久久久电影| 日韩精品免费看| 亚洲成人免费网站| 欧美亚洲另类制服自拍| 国产日韩欧美中文| 久久成人国产精品| www.日本久久久久com.| 亚洲国产精品嫩草影院久久| 九九久久国产精品| 高清一区二区三区四区五区| 97精品视频在线| 亚洲国产另类久久精品| 91香蕉电影院| 国产精品美女www爽爽爽视频| 亚洲伦理中文字幕| 亚洲成人网av| 国产中文欧美精品| 国产精品美女www爽爽爽视频| 亚洲精品久久久久久久久久久久| 日韩中文字幕在线播放| 欧美一区二区三区艳史| 91久久久精品| 亚洲欧美日本另类| 日韩在线资源网| 国产精品一区二区三| 4k岛国日韩精品**专区| 这里只有精品视频| 91美女福利视频高清| 国产97人人超碰caoprom| 日韩美女在线观看| 日韩精品在线免费播放| 欧美www在线| www.欧美免费| 国产精品扒开腿做| 中文字幕日韩在线视频|