Express.js — 使用path()找出根目錄(root folder)和結合檔案路徑

Steve Leng
Oct 31, 2020

--

一、假設專案資料夾長這樣

(root folder)
├─ public
│ └─ css
│ ├─ main.css
│ └─ product.css
├─ routes
│ ├─ admin.js
│ └─ shop.js
├─ util
│ └─ path.js
├─ views
│ ├─ 404.html
│ ├─ add-product.html
│ └─ shop.html
├─ app.js
└─ package.json

二、狀況:

想要透過/routes/shop.js ,藉由response送出 views/shop.html到客戶端的話,就要在res.sendFile()裡面指定檔案的路徑參數。

參數路徑可以寫成:

"../views/shop.html"

三、或是可以用另外一個方法。透過express.js內建的path module,先將指向伺服器的root檔案資料夾,例如:

util/path.js

const path = require('path');// module.exports = path.dirname(process.mainModule.filename); 舊版的寫法
module.exports = path.dirname(require.main.filename); // Node.js v12之後的寫法

使用path.dirname(require.main.filename)不論在哪個資料夾使用的話都會指向root。並且將輸出的內容匯入到其他檔案存在變數裡面就可以用了(例如以下的rootDir)

四、好處是不論從哪個資料夾執行要輸出檔案的function,輸出檔案的路徑都可以直接從root開始寫就好

例如:

根目錄/folder_x/folder_y/file_z.js 的程式要送出

根目錄/folder_a/folder_b/file_c.html

就不用在file_z.js裡面寫成

res.sendFile("./../../folder_a/folder_b/file_c.html")

只要透過寫下面這樣就可以

res.sendFile(path.join(rootDir, ‘views’, ‘shop.html’));
// 等於 "(根目錄)/views/shop.html"

好處是這樣可以避免寫錯和打一堆 ../ 的麻煩。而且可以重複套用在任何要送出檔案的程式,算是一個蠻好用的helper function

這樣可以避免寫錯和打一堆 ../ 的麻煩。而且這個方式可以重複套用在任何要送出檔案的程式,算是一個蠻好用的helper function

======================================

五、回到一開始的專案例子

在/routes/shop.js裡面使用path.js module,和透過 path.join(rootDir, ‘views’, ‘shop.html’) 就可以透過response輸出 views/shop.html

const path = require('path');const express = require('express');const rootDir = require('../util/path');  //輸出為rootDirconst router = express.Router();router.get(‘/shop’, (req, res, next) => {res.sendFile(path.join(rootDir, ‘views’, ‘shop.html’));// equals to res.sendFile(‘/views/shop.html’)});

解釋:

因為path.join()的可以把輸入的參數作為資料夾名稱,一個一個接起來

例如

path.join(‘views’, ‘shop.html’) 就等於 "views/shop.html “

path.join(rootDir, ‘views’, ‘shop.html’) 就等於 “ (根目錄)/views/shop.html “

--

--

Steve Leng
Steve Leng

No responses yet