最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodejs的路徑問題的解決

 更新時間:2018年06月30日 14:53:37   作者:flyfox1982  
這篇文章主要介紹了nodejs的路徑問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

can not get file index.html

express.static

問題出在哪兒?

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

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

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

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

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

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

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

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

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

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方法,繼續(xù)往下看。

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'

現(xiàn)在的問題是,啥是當前工作目錄。

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下面執(zhí)行命令 :node test.js 輸出如下:

 /Users/terry/Documents/JSWorkspace

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

/Users/terry/Documents

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

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

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

如何解決

解決的方法:

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

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'));

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

相關文章

  • Node4-5靜態(tài)資源服務器實戰(zhàn)以及優(yōu)化壓縮文件實例內容

    Node4-5靜態(tài)資源服務器實戰(zhàn)以及優(yōu)化壓縮文件實例內容

    這篇文章主要介紹了Node4-5靜態(tài)資源服務器實戰(zhàn)以及優(yōu)化壓縮文件實例內容,有需要的朋友們可以參考學習下。
    2019-08-08
  • 詳解NodeJs項目 CentOs linux服務器線上部署

    詳解NodeJs項目 CentOs linux服務器線上部署

    這篇文章主要介紹了NodeJs項目 CentOs linux服務器線上部署,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 淺談Node的內存泄露

    淺談Node的內存泄露

    隨著node、react同構等技術越來越廣泛地使用, 內存泄漏的事情時有發(fā)生,應當引起足夠的重視,本文主要介紹了Node的內存泄露,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Express+Nodejs 下的登錄攔截實現(xiàn)代碼

    Express+Nodejs 下的登錄攔截實現(xiàn)代碼

    本篇文章主要介紹了Express+Nodejs 下的登錄攔截實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 在Nodejs中實現(xiàn)一個緩存系統(tǒng)的方法詳解

    在Nodejs中實現(xiàn)一個緩存系統(tǒng)的方法詳解

    在數(shù)據庫查詢遇到瓶頸時,我們通常可以采用緩存來提升查詢速度,同時緩解數(shù)據庫壓力,在一些簡單場景中,我們也可以自己實現(xiàn)一個緩存系統(tǒng),避免使用額外的緩存中間件,這篇文章將帶你一步步實現(xiàn)一個完善的緩存系統(tǒng),需要的朋友可以參考下
    2024-03-03
  • Node.js API詳解之 V8模塊用法實例分析

    Node.js API詳解之 V8模塊用法實例分析

    這篇文章主要介紹了Node.js API詳解之 V8模塊用法,結合實例形式分析了Node.js API中V8模塊基本功能、函數(shù)、使用用法及操作注意事項,需要的朋友可以參考下
    2020-06-06
  • M2實現(xiàn)Nodejs項目自動部署的方法步驟

    M2實現(xiàn)Nodejs項目自動部署的方法步驟

    這篇文章主要介紹了M2實現(xiàn)Nodejs項目自動部署的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Node.js實現(xiàn)簡單管理系統(tǒng)

    Node.js實現(xiàn)簡單管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Node.js實現(xiàn)簡單管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • npm?does?not?support?Node.js問題的解決辦法

    npm?does?not?support?Node.js問題的解決辦法

    這篇文章主要給大家介紹了關于npm?does?not?support?Node.js問題的解決辦法,文中通過代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • node檢測端口可用性的實踐示例

    node檢測端口可用性的實踐示例

    本文主要介紹了node檢測端口可用性的實踐示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02

最新評論

甘洛县| 汽车| 永城市| 手机| 金阳县| 靖宇县| 宁波市| 来凤县| 聂荣县| 平凉市| 格尔木市| 阜康市| 如皋市| 崇文区| 贡嘎县| 岳池县| 芜湖市| 临汾市| 弥勒县| 辉县市| 闽侯县| 金平| 芦溪县| 栾城县| 磐石市| 云安县| 崇明县| 安陆市| 六盘水市| 庆安县| 登封市| 神农架林区| 镇康县| 阿合奇县| 嘉鱼县| 特克斯县| 九台市| 衡水市| 航空| 玛沁县| 边坝县|