Express.js — 使用path()找出根目錄(root folder)和結合檔案路徑
一、假設專案資料夾長這樣
(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 “